std::filesystem::directory_iterator 不能递归遍历子目录,仅遍历直接子项;需用 recursive_directory_iterator 或手动递归实现全路径遍历。

std::filesystem::directory_iterator 能不能递归遍历子目录
不能。它只遍历指定路径的**直接子项**,不进入子文件夹。想遍历全部文件(含嵌套),得手动递归或改用 std::filesystem::recursive_directory_iterator。
用 directory_iterator 遍历当前目录的正确写法
必须捕获 std::filesystem::filesystem_error,因为权限不足、路径不存在或符号链接损坏都会抛异常,不处理就 crash。
- 构造
directory_iterator前建议先用exists()和is_directory()检查路径有效性 - 迭代器解引用返回
std::filesystem::directory_entry,用.path()获取完整路径,.is_regular_file()判断是否为普通文件 - 不要在循环中对同一路径反复调用
status()——它可能触发额外系统调用;优先复用entry.status()或entry.symlink_status()
disable_recursion_pending()
- 仅对当前
directory_entry生效,不影响已入栈的其他路径 - 必须在该 entry 还在迭代器当前位置时调用(即在 for 循环体内部、且未 ++ 之前)
- 常见误用:在判断后直接 continue,忘了调用
disable_recursion_pending(),结果还是进了目录
for (auto iter = std::filesystem::recursive_directory_iterator("/src");
iter != std::filesystem::recursive_directory_iterator{};
++iter) {
if (iter->path().filename() == "build") {
iter.disable_recursion_pending(); // 关键:否则仍会递归进去
continue;
}
if (iter->is_regular_file()) {
process(*iter);
}
}
Windows 下中文路径乱码或报错怎么办
VC++ 默认使用窄字符(char)路径接口,传入 UTF-8 字符串时,若系统区域不是 UTF-8(如中文 Windows 默认 GBK),std::filesystem 会解析失败。
- 最稳方案:用宽字符路径,构造
std::wstring后传给std::filesystem::path构造函数 - 编译时加
/utf-8并确保源文件存为 UTF-8 with BOM,可缓解部分问题,但不保证 100% 可靠 - 避免把用户输入的窄字符串直接拼成路径——比如
std::string user_input = "测试"; path(user_input)在 Windows 上大概率出错
真正跨平台安全的做法,是统一走宽字符路径,或者用第三方库(如 Boost.Filesystem)做抽象层。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











