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

如何在C++中无异常使用recursive_directory_iterator

无需异常使用std::filesystem::recursive_directory_iterator的方法

要避免recursive_directory_iterator因路径不存在抛出异常,你可以使用它的非抛出构造函数重载——带std::error_code参数的版本,构造时不会抛出异常,而是通过错误码对象返回初始化结果。

修改后的示例代码

#include <filesystem>
#include <iostream>

namespace fs = std::filesystem;

int main() {
    std::error_code ec;
    // 传入错误码参数,构造迭代器时不抛出异常
    auto dir_iter = fs::recursive_directory_iterator("I-dont-exist", ec);
    
    // 先检查迭代器是否初始化成功
    if (ec) {
        std::cout << "初始化失败:" << ec.message() << '\n';
        return 1;
    }

    // 正常遍历目录项
    for (auto const& dir_entry : dir_iter) {
        std::cout << dir_entry.path() << '\n';
    }
    return 0;
}

额外优化:忽略权限不足的情况

如果遍历过程中遇到权限不足的目录,不想因此中断遍历,可以加上directory_options::skip_permission_denied选项:

auto dir_iter = fs::recursive_directory_iterator(
    "I-dont-exist", 
    fs::directory_options::skip_permission_denied, 
    ec
);

关键说明

  • 构造时传入的std::error_code对象会在初始化失败时被设置对应错误值(比如路径不存在时为std::errc::no_such_file_or_directory),可以通过ec.message()获取可读的错误描述。
  • 不能直接用范围for循环创建临时迭代器(原代码的写法),因为临时对象的默认构造(不带错误码)仍会抛出异常,必须显式构造并检查错误码后再遍历。

内容的提问来源于stack exchange,提问作者HelloWorld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:36:26