c++ - 无法进入子目录

标签 c++ visual-studio-2012 boost filesystems c++-tr2

熟悉<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 中指定的目录中的直接目录。 .不访问子目录。为了说明,我做了一个非常简单的目录结构:

abcd

程序的输出如下:

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/

相关文章:

c++ - 遍历基类成员

c++ - 这种替代的 'for' 循环语法有什么依据吗?

c++ - 如何构建用于交叉编译的 Qt 5.7.0?

c - 建立字典

angularjs - 在 Azure 服务器 Hot Towel Angular 上获取元数据查询失败错误 Breeze/Breeze/元数据

c++ - 搜索当前类实例的 boost::bimap

c++ - 如何在 C++ 中使用 cin 退出

asp.net - 在 Visual Studio 中的同一解决方案中运行多个 Web 表单应用程序

c++ - Boost::asio 不在 Debian Wheezy 上?

c++ - 为什么 Visual Studio 2010 会在 Boost 1.42.0 中抛出这个错误?