我正在为课程编写程序,我想知道一些代码的输出。我有一些像这样的代码:
DIR* dir = opendir(".");
struct dirent* reader;
while ((reader = readdir(dir)) != NULL)
{
//print the name of the path found by reader.
}
现在这个工作正常,但我注意到前两个列表总是:
.
..
//rest of files here
现在我假设第一个点.
只是当前目录的名称,但第二个双点是什么?我知道cd ..
允许你进入文件层次结构,但我不知道为什么在读取子目录名时输出它。
我担心的原因是因为我想递归遍历所有文件,但如果我浏览..
,那么第一个目录名就是.
,这会导致循环。那我怎么能避免这个呢?
答案 0 :(得分:6)
..
是父目录。除非您在文件系统根目录下,否则它与根目录相同。
您基本上想检查dir
变量是否等于.
或..
。如果是,则跳过该目录。
您可以通过在while
循环中进行检查,或者从目录数组中过滤掉这两个目录来实现此目的。
哦,请确保您不会意外跳过以.
开头的目录,因为这些目录仍然是有效目录。确保整个目录名称为.
或..
。
答案 1 :(得分:2)
当降级到目录结构时,限制递归是很重要的 - 只是忽略.
(当前目录)和..
(父目录)是不够的(但它确实避免了一些无用的旅行:-)。考虑链接到foo
的符号链接文件.
- 它与跟随.
的效果相同。
保持深度计数或“看到的目录”或结构(智能实现可以检测和修剪周期)。还可以考虑使用readlink来检查目标。 (注意hardlinks to directories can be created in OS X所以readlink可以提供帮助,但不会省略其他警卫的需要。)
快乐的编码。