能否用recursive_directory_iterator跳过EPERM错误遍历部分可读目录树?
解决recursive_directory_iterator遍历跳过不可读目录的问题
原代码遇到权限错误(比如Windows错误码5)时停止,核心原因是仅重置错误码并continue无法让迭代器跳过不可读目录、继续遍历其他可读分支。要在保留recursive_directory_iterator的前提下实现完整遍历,需在遇到访问错误时禁用当前目录的递归逻辑,让迭代器跳过该目录的子项,继续处理后续条目。
修正后的代码示例
#include <iostream> #include <filesystem> using namespace std; using namespace filesystem; int main() { error_code ec; // 用原始字符串避免路径转义问题,也可写成"C:\\" recursive_directory_iterator di(R"(C:\)", ec); for (; di != recursive_directory_iterator(); di.increment(ec)) { if (ec) { cerr << "无法访问目录: " << di->path() << ",错误信息: " << ec.message() << endl; // 禁用当前目录的递归,跳过该目录下所有子项 di.disable_recursion_pending(); // 重置错误码,确保迭代器能继续推进 ec.clear(); continue; } cout << di->path() << endl; } }
关键说明
disable_recursion_pending():这是核心方法,会告知迭代器不要进入当前指向的不可读目录,直接跳过该目录的所有子项,转而处理同级的其他条目。- 错误处理逻辑:遇到权限错误时,先输出错误信息(可选),再调用
disable_recursion_pending(),最后清空错误码,保证迭代器能正常继续遍历流程。 - 路径转义修正:原代码的
"C:\"存在字符串转义错误,需改为"C:\\"或使用C++11引入的原始字符串字面量R"(C:\)"来避免转义问题。
修改后,迭代器遇到不可读目录时不会终止遍历,会自动跳过该目录分支,继续处理其他可读的目录树节点。
内容的提问来源于stack exchange,提问作者Edison von Myosotis
相关产品推荐
相关产品推荐

