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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:39:47