【问题标题】:How to ignore hidden files with opendir and readdir in C library如何在 C 库中使用 opendir 和 readdir 忽略隐藏文件
【发布时间】:2009-05-10 15:51:28
【问题描述】:

下面是一些简单的代码:

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

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

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

【问题讨论】:

    标签: c unix file-io


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • +1。只需在 "puts(...)" 前面插入文本 "if (*cur->d_name != '.')" 即可获得 ls 的默认行为。
    • @j_random_hacker:如果他不想要备份文件,他还必须检查尾随的~。
    • 谢谢大家!如果可以的话,我想选择所有答案。现在,我已经完全明白这件事了。再次感谢您!
    • 我们如何忽略文件夹?
    【解决方案2】:

    消除隐藏文件:

    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);
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        这种行为完全就像ls -a 所做的那样。如果您想要过滤,那么您需要事后进行。

        【讨论】:

          猜你喜欢
          • 2015-06-22
          • 1970-01-01
          • 2012-09-25
          • 1970-01-01
          • 2011-02-09
          • 2021-08-13
          • 2016-06-21
          • 1970-01-01
          相关资源
          最近更新 更多