无法进入子目录
Posted
技术标签:
【中文标题】无法进入子目录【英文标题】:having trouble walking into subdirectories 【发布时间】:2013-08-29 15:20:06 【问题描述】:为了熟悉<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 中运行了零次。为什么?
【问题讨论】:
您知道提案中的recursive_directory_iterator
并寻求重新实施吗?
【参考方案1】:
从输出看,it->path()
给你的是相对路径,而不是绝对路径。迭代时,您的 当前目录 不会更改,因此尝试迭代路径为“b”或“c”的目录将不起作用,并且不会在该不存在的目录中找到子目录。在您的 for 循环中,尝试以下递归调用:
walk(root/it->path());
现在,当你的程序检查目录 c 时,它应该输出:
ENTERING d:/a/c
ENTERING d:/a/c/d
etc...
【讨论】:
谢谢,它的工作原理:) 有没有另一种方法可以从it->path()
获取绝对路径,而无需手动添加根,通过调用路径上的成员函数或其他方式?还是it->path()
只是字符串“c”的包装,没有足够的信息自行重构绝对路径?
@FredOverflow:我不能给你一个明确的答案,我绝不是这方面的专家,但是是的,根据我的经验,路径对象是保存路径字符串的方便数据结构它们与实际的文件系统完全分开。赋予路径意义的是文件系统库的其他函数。真正让我吃惊的是,directory_entry::path
成员没有给出绝对路径,因为目录迭代器 is 实际上与实际文件系统上的实体相关联。以上是关于无法进入子目录的主要内容,如果未能解决你的问题,请参考以下文章
右键windows terminal here无法进入当前目录
pycharm无法新建django项目,报错timed out,需先建立pure项目,进入后建立django项目,最后调整目录层级。