2011-11-10 41 views
0

在“C”代码中,我想列出目录中的所有文件并删除最旧的文件。我怎么做?列出目录中的文件并在C/C++中删除它们

我可以使用popen吗?或者我们有其他解决方案?

感谢,

+1

Plain C没有任何目录的概念,因此您需要指定您想要执行此操作的操作系统。 – caf

+0

Linux 2.6.x内核 – Kitcha

+1

@caf:实际上,纯C(这似乎暗示了编程语言本身)甚至没有关于文件或其他任何事物的概念。 C由大约32个关键字组成,几个操作员就是这样。所有这些文件,目录等概念都是在库中定义的。所以如果你不是指语言定义本身,那么问题是标准C库中定义的目录是什么?答案是肯定的。特别是dirent.h接口到OS的目录概念是一个X.Open和POSIX.1标准。 –

回答

3

从标签中,我假设你想在符合POSIX的系统中做到这一点。在这种情况下的文件夹中列出文件的代码片段是这样的:

#include <dirent.h> 
#include <sys/types.h> 
#include <stdio.h> 

DIR* dp; 
struct dirent* ep; 
char* path = "/home/mydir"; 

dp = opendir(path); 
if (dp != NULL) 
{ 
    printf("Dir content:\n"); 
    while(ep = readdir(dp)) 
    { 
    printf("%s\n", ep->d_name); 
    } 
} 
closedir(dp); 

要检查文件创建或修改时间,使用stat(男子2 STAT)。要删除文件,只需使用功能remove(const char* path)

+0

我不完全确定删除开放目录中的文件是安全的(因为扫描的目录是在扫描时更新)。我的建议是两次完成:第一次扫描,找到要删除的文件,第二次删除它们。 –

+0

这是非常好的评论。但是,在这种情况下,您必须在删除之前完成扫描,因为OP要删除最旧的文件(您必须检查所有文件才能找到最早的文件)。 – Patryk

1

可以使用readdiropendir 扫描目录,如果你想遍历(递归)的文件层次ftsnftw。不要忘记忽略当前目录"."和父".."之一的条目。您可能还想使用系统调用stat

+0

谢谢。让我尝试一下。 – Kitcha

+0

如果没有'opendir()',你不能使用'readdir()' - 一个不会被另一个使用。 – Dave

+0

谢谢,我编辑,使其readdir和opendir –

2

在Linux(以及任何POSIX系统)上,您可以通过调用opendir()/readdir()/closedir()来阅读目录。然后,您可以在每个目录条目上调用stat()以确定它是否是文件,以及它的访问/修改/状态更改时间。

如果您对“最老”的定义取决于文件的创建时间,那么您就不稳固了 - 传统上UNIX并没有记录创建时间。在Linux上,一些最新的文件系统通过扩展属性file.crtime(您使用getxattr()sys/xattr.h访问)提供扩展属性,但您必须处理该属性不存在的常见情况。

相关问题