3

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

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 ..可以让你在文件层次结构中上升,但我不知道为什么在读取子目录名称时会输出它。

我担心的原因是因为我想递归地遍历所有文件,但是如果我遍历..,则其中的第一个目录名称是.,这会导致循环。那么我该如何避免这种情况呢?

4

2 回答 2

6

..父目录。除非您位于文件系统根目录,在这种情况下,它与根目录相同。

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

您可以通过将该检查放入while循环中或通过从目录数组中过滤掉这两个目录来实现此目的。

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

于 2011-09-01T21:33:02.770 回答
2

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

保留深度计数或“已见目录”或结构(智能实现可以检测和修剪周期)。还可以考虑使用readlink来检查目标。(请注意,可以在 OS X 中创建指向目录的硬链接,因此 readlink 可以提供帮助,但不会忽略对其他守卫的需要。)

快乐编码。

于 2011-09-01T21:39:32.777 回答