【问题标题】:How to elimate names which start with "." when files are listed如何消除以“。”开头的名称列出文件时
【发布时间】:2021-01-13 18:43:54
【问题描述】:

我正在尝试通过 c 程序模仿 ls -l 命令 但不幸的是没有得到如何忽略文件,如 “。” , ".." 和 ".filename" 但不是 filename.c 我设法找到 .在文件名中并忽略,但后来意识到我什至丢失了 filename.c

实际内容是

.
..
.bitfile
.gnupg
krishna
program.c
temp

现在我的代码是

while ((dir = readdir(d)) != NULL)
        {
            if (strstr(dir->d_name, ".") != NULL || strstr(dir->d_name, "..") != NULL)
                continue; 
            strcpy(array[i], dir->d_name);
            i++;
        }

数组中的内容是:

krishna
temp

但预期的输出是

krishna
program.c
temp

【问题讨论】:

  • if(dir->d_name[0] == '.') continue; 在您的情况下,您可以使用 if (strstr(dir->d_name, ".") == dir->d_name) 的子字符串测试字符串 began
  • 请注意,Weather Vane [和 P.J.] 的建议是正确的。虽然不太紧凑,但您想要的代码不是 strstr 而是strcmp。您需要比较 0 和 not NULL(例如):strcmp(dir->d_name, ".") == 0 您可能需要查看 ls 的 -a 和 -A 选项,因为它们会改变是否. 文件是否显示。
  • @CraigEstey 如何与.filename 合作?
  • @CraigEstey 你可以用一些像strncmp(dir->d_name, ".",1) 这样的变态方式来做到这一点。但这是检查单个字符的相当荒谬的方式。
  • @P__JsupportswomeninPoland 我并不是在提倡 strcmp 而不是 [0] == '.' 方法,只是 OP 希望 strcmp 用于他/她的方法。通常,我们希望strcmp [或if ((d_name[0] == '.') && ((d_name[1] == '.') || (d_name[1] == 0)))] 捕获. 和.. 棘手的部分是我们想要模拟ls 并跳过以. 开头的文件[甚至@987654347 @],这样可以简化测试。

标签: c substring c-strings


【解决方案1】:

为什么不干脆:

if (dir->d_name[0] == '.') continue;

【讨论】:

  • 这是完全错误的。 linux 很多文件都是以 .并且被隐藏了。
  • @WalterM,他们的文件名以点 开头的事实是 使他们隐藏的原因。这只是一个约定,这些文件没有什么特别之处。所以是的,答案是完全正确的,因为实际上ls 也会这样做。
  • 不。 “……和隐藏文件不一样。查看-A标志。
  • @WalterM 没关系,因为 OP 想要跳过任何带有 '.' 的文件 && 目录。那么这里的 plain wrong 是什么?
猜你喜欢
  • 2016-03-17
  • 2014-03-29
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
相关资源
最近更新 更多