为何C++的recursive_directory_iterator无法递归列出所有子目录?
问题描述
我为《C++ Primer》编写了习题解答,目录结构为主目录下包含part_1、part_2、part_3、part_4等子目录及部分文件,每个part_*目录下还有对应章节目录存放习题解答。
我尝试用std::filesystem::recursive_directory_iterator和递归调用directory_iterator两种方式递归列出所有文件和目录,但结果只能列出主目录下的所有目录,以及part_3内的所有子目录与文件,其余part_*目录内的内容无法被列出。我已经传入follow_directory_symlink参数,但问题依然存在。
相关代码如下:
#include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { fs::path curr("/c++_primer_github"); // 未贴出真实路径 for( const auto &entry : fs::recursive_directory_iterator(curr, fs::directory_options::follow_directory_symlink)) { if (fs::is_directory(entry)) { std::cout << "[+]" << entry.path().filename() << std::endl; } else if (fs::is_regular_file(entry)) { std::cout << entry.path().filename() << " " << entry.file_size() << std::endl; } } return 0; }
可能的原因与解决办法
- 目录权限不足:程序运行用户对
part_1、part_2等目录没有读取权限。std::filesystem默认会跳过无权限访问的目录且不报错。- 解决:检查目标目录的权限设置(Linux用
ls -ld part_*,Windows右键查看属性),确保运行程序的用户拥有读权限。
- 解决:检查目标目录的权限设置(Linux用
- 符号链接无效或存在循环:如果
part_*是符号链接,即使加了follow_directory_symlink,若链接指向不存在的路径或形成循环,遍历器会跳过该目录。- 解决:用
fs::is_symlink()检查目录类型,验证链接指向的路径是否有效,避免循环链接。
- 解决:用
- 路径错误:确认
curr指向的主目录路径正确,尤其是真实路径是否包含特殊字符、大小写是否匹配(Windows系统大小写不敏感,但Linux会区分)。- 解决:输出
curr.absolute()查看绝对路径,确认路径无误。
- 解决:输出
- 缺失错误处理:默认遍历器遇到访问错误会静默跳过,无法定位问题。
- 解决:添加错误处理逻辑,比如用
std::error_code捕获错误信息:#include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { fs::path curr("/c++_primer_github"); std::error_code ec; for (const auto &entry : fs::recursive_directory_iterator(curr, fs::directory_options::follow_directory_symlink, ec)) { if (ec) { std::cerr << "访问条目出错: " << entry.path() << " - " << ec.message() << std::endl; ec.clear(); continue; } if (fs::is_directory(entry)) { std::cout << "[+]" << entry.path().filename() << std::endl; } else if (fs::is_regular_file(entry)) { std::cout << entry.path().filename() << " " << entry.file_size() << std::endl; } } return 0; }
- 解决:添加错误处理逻辑,比如用
- 标准库版本问题:旧版本的
std::filesystem可能存在递归遍历的bug,比如GCC 7及以下、MSVC 2017早期版本。- 解决:升级编译器到支持C++17的稳定版本(GCC 8+、Clang 9+、MSVC 2019+)。
内容的提问来源于stack exchange,提问作者semicolon_missing
相关产品推荐
相关产品推荐

