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

fwo*_*ncn 5 c unix file-io

这是一些简单的代码:

DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) puts(cur->d_name);
Run Code Online (Sandbox Code Playgroud)

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

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

Zif*_*fre 16

这个是正常的.如果你这样做ls -a(显示所有文件,ls -A将显示除.和之外的所有文件..),你将看到相同的输出.

.是一个指向它所在目录的链接:foo/bar/.是同一个东西foo/bar.

..是一个链接,指向它所在目录的父目录:与之foo/bar/..相同foo.

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

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

  • +1.只需在"puts(...)"前面插入文本"if(*cur-> d_name!='.')"即可获得ls的默认行为. (4认同)

Ank*_*kit 7

消除隐藏文件:

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)