【发布时间】:2009-05-10 15:51:28
【问题描述】:
下面是一些简单的代码:
DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) puts(cur->d_name);
我得到的有点乱:包括点 (.)、点点 (..) 和以 ~ 结尾的文件名。
我想做与命令ls 完全相同的事情。请问如何解决这个问题?
【问题讨论】:
下面是一些简单的代码:
DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) puts(cur->d_name);
我得到的有点乱:包括点 (.)、点点 (..) 和以 ~ 结尾的文件名。
我想做与命令ls 完全相同的事情。请问如何解决这个问题?
【问题讨论】:
这是正常的。如果您执行ls -a(显示所有文件,ls -A 将显示除. 和.. 之外的所有文件),您将看到相同的输出。
. 是指向其所在目录的链接:foo/bar/. 与foo/bar 相同。
.. 是指向其所在目录的父目录的链接:foo/bar/.. 与foo 相同。
任何其他以. 开头的文件都是隐藏文件(按照惯例,它并没有真正被任何东西强制执行;这与Windows 不同,Windows 有一个真正的、官方的隐藏属性)。以~ 结尾的文件可能是由您的文本编辑器创建的备份文件(同样,这是惯例,这些真的可以是任何东西)。
如果您不想显示这些类型的文件,则必须明确检查并忽略它们。
【讨论】:
消除隐藏文件:
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);
}
}
【讨论】:
在处理名称之前粘贴if (cur->d_name[0] != '.')。
UNIX 隐藏文件标准是前导点,. 和 .. 也匹配。
结尾的~ 是备份文件的标准。忽略这些需要更多的工作,但数千兆赫的 CPU 可以管理它。使用类似if (cur->d_name[strlen(cur->d_name)-1] == '~')
【讨论】:
这种行为完全就像ls -a 所做的那样。如果您想要过滤,那么您需要事后进行。
【讨论】: