以下是一些简单的代码:
DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) puts(cur->d_name);
我得到的有点混乱:包括点(.
),点(..
)和以~
结尾的文件名。
我想做与命令ls
完全相同的事情。我该如何解决这个问题?
答案 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
的行为完全相同。如果你想要过滤,那么你需要在事后做到这一点。