为了使自己熟悉<filesystem>,我编写了一个简单的递归函数来遍历目录树:

#include <filesystem>

namespace fs = std::tr2::sys;
const fs::directory_iterator fs_end;

void walk(fs::path root)
{
    std::cout << "ENTERING " << root << '\n';
    for (auto it = fs::directory_iterator(root); it != fs_end; ++it)
    {
        if (is_directory(it->status()))
        {
            walk(it->path());
        }
        else
        {
            std::cout << it->path() << " is not a directory\n";
        }
    }
    std::cout << "LEAVING " << root << '\n';
}

int main()
{
    walk("d:/a");
}


不幸的是,这只会访问main中指定目录内的直接目录。子目录不被访问。为了说明,我做了一个非常简单的目录结构:



该程序的输出如下:

ENTERING d:/a
ENTERING b
LEAVING b
ENTERING c
LEAVING c
LEAVING d:/a


如您所见,没有访问d。显然,for循环在c中运行了零次。为什么?

最佳答案

从输出看来,it->path()在给您相对路径,而不是绝对路径。迭代时,当前目录不会更改,因此尝试在路径为'b'或'c'的目录上进行迭代将不起作用,并且在该不存在的目录中将找不到子目录。在for循环中,尝试以下递归调用:

walk(root/it->path());


现在,当您的程序检查目录c时,它将输出:

ENTERING d:/a/c
ENTERING d:/a/c/d
etc...

关于c++ - 进入子目录时遇到麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18514912/

10-12 17:47
查看更多