为了熟悉<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内运行零次。为什么呢?
答案 0 :(得分:1)
从输出看起来it->path()
给出了相对路径,而不是绝对路径。在迭代时,您的当前目录不会更改,因此尝试迭代路径为“b”或“c”的目录将不起作用,并且在该不存在的目录中将找不到子目录。在for循环中,尝试以下递归调用:
walk(root/it->path());
现在,当您的程序检查目录c时,它应该输出:
ENTERING d:/a/c
ENTERING d:/a/c/d
etc...