C++ recursive_directory_iterator异常:仅遍历首个目录即退出
问题分析与解决方案
问题出在你手动调用increment()的逻辑上:当遇到权限拒绝等错误时,错误码error_code被设置后,迭代器可能直接跳转到end状态,导致循环提前终止。此外,skip_permission_denied选项需要配合正确的迭代逻辑才能生效,实现跳过无法访问目录、继续遍历剩余内容的效果。
解决方案1:使用范围for循环(推荐)
范围for循环会自动处理迭代过程,配合skip_permission_denied选项可自动跳过无法访问的目录,无需手动管理迭代器增量,代码更简洁可靠:
#include <filesystem> #include <iostream> namespace fs = std::filesystem; // 用别名简化命名空间引用 int main(){ const std::string directory = "c:\\Users\\"; try { // 范围for遍历递归目录迭代器 for (const auto& entry : fs::recursive_directory_iterator( directory, fs::directory_options::skip_permission_denied )) { if (entry.is_regular_file()) { std::cout << "File: " << entry.path().string() << std::endl; } } } catch (const fs::filesystem_error& e) { std::cerr << "文件系统错误: " << e.what() << std::endl; } std::cout << "\nEnd Here" << std::endl; return 0; }
解决方案2:修复手动迭代逻辑
若坚持手动管理迭代器,需每次增量前清空错误码,确保迭代器未到达end状态时继续循环:
#include <filesystem> #include <iostream> namespace fs = std::filesystem; int main(){ const std::string directory = "c:\\Users\\"; auto d_init = fs::recursive_directory_iterator( directory, fs::directory_options::skip_permission_denied ); const auto d_end = fs::recursive_directory_iterator(); std::error_code ec; while (d_init != d_end) { if (!ec) { // 仅无错误时处理当前条目 if (d_init->is_regular_file()) { std::cout << "File: " << d_init->path().string() << std::endl; } } ec.clear(); // 增量前清空错误码 d_init.increment(ec); // 执行增量并捕获错误 if (ec) { std::cerr << "跳过无法访问的条目: " << ec.message() << std::endl; } } std::cout << "\nEnd Here" << std::endl; return 0; }
额外注意事项
- 确保程序以管理员权限运行,否则C:\Users下的部分用户目录会因权限限制被
skip_permission_denied自动跳过。 All Users是指向C:\ProgramData的符号链接,递归迭代器默认会跟随符号链接进入该目录,属于正常行为。
内容的提问来源于stack exchange,提问作者Vinicius Fernandes
相关产品推荐
相关产品推荐

