C中的“双点”目录名?

时间:2011-09-01 21:30:02

标签: c macos opendir

我正在为课程编写程序,我想知道一些代码的输出。我有一些像这样的代码:

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 ..允许你进入文件层次结构,但我不知道为什么在读取子目录名时输出它。

我担心的原因是因为我想递归遍历所有文件,但如果我浏览..,那么第一个目录名就是.,这会导致循环。那我怎么能避免这个呢?

2 个答案:

答案 0 :(得分:6)

..是父目录。除非您在文件系统根目录下,否则它与根目录相同。

您基本上想检查dir变量是否等于...。如果是,则跳过该目录。

您可以通过在while循环中进行检查,或者从目录数组中过滤掉这两个目录来实现此目的。

哦,请确保您不会意外跳过以.开头的目录,因为这些目录仍然是有效目录。确保整个目录名称为...

答案 1 :(得分:2)

当降级到目录结构时,限制递归是很重要的 - 只是忽略.(当前目录)和..(父目录)是不够的(但它确实避免了一些无用的旅行:-)。考虑链接到foo的符号链接文件. - 它与跟随.的效果相同。

保持深度计数或“看到的目录”或结构(智能实现可以检测和修剪周期)。还可以考虑使用readlink来检查目标。 (注意hardlinks to directories can be created in OS X所以readlink可以提供帮助,但不会省略其他警卫的需要。)

快乐的编码。