You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:52:35