如何在C库中忽略带有opendir和readdir的隐藏文件

时间:2009-05-10 15:51:28

标签: c unix file-io

以下是一些简单的代码:

DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) puts(cur->d_name);

我得到的有点混乱:包括点(.),点(..)和以~结尾的文件名。

我想做与命令ls完全相同的事情。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:16)

这很正常。如果您执行ls -a(显示所有文件,ls -A将显示除...以外的所有文件),您将看到相同的输出。

.是指向其所在目录的链接:foo/bar/.foo/bar相同。

..是指向其所在目录的父目录的链接:foo/bar/..foo相同。

.开头的任何其他文件都是隐藏文件(按照惯例,它并没有真正强制执行;这与Windows不同,后者存在真正的官方隐藏属性)。以~结尾的文件可能是由文本编辑器创建的备份文件(同样,这是惯例,这些可能可以是任何东西)。

如果您不想显示这些类型的文件,则必须明确检查它们并忽略它们。

答案 1 :(得分:6)

消除隐藏文件:

DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) {
    if (cur->d_name[0] != '.') {
        puts(cur->d_name);
    }
}

消除以“〜”结尾的隐藏文件和文件:

DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) {
    if (cur->d_name[0] != '.' && cur->d_name[strlen(cur->d_name)-1] != '~') {
        puts(cur->d_name);
    }
}

答案 2 :(得分:2)

在处理名称之前粘贴if (cur->d_name[0] != '.')

UNIX隐藏文件标准是前导点,...也匹配。

尾随~是备份文件的标准。忽略这些是一项更多的工作,但是一个千兆赫的CPU可以管理它。使用类似if (cur->d_name[strlen(cur->d_name)-1] == '~')

的内容

答案 3 :(得分:1)

此行为完全ls -a的行为完全相同。如果你想要过滤,那么你需要在事后做到这一点。