0

0

c++中如何使用std::filesystem::recursive_directory_iterator_c++递归遍历目录【实例】

尼克

尼克

发布时间:2026-01-19 16:05:02

|

640人浏览过

|

来源于php中文网

原创

std::filesystem::recursive_directory_iterator默认跳过符号链接、深度优先遍历;需显式指定directory_options::follow_directory_symlink才跟随软链接;可用disable_recursion_pending()跳过指定子目录。

c++中如何使用std::filesystem::recursive_directory_iterator_c++递归遍历目录【实例】

std::filesystem::recursive_directory_iterator 怎么用

直接构造就能开始遍历,它默认自动跳过符号链接(不跟随),且会按深度优先顺序进入子目录。关键点是:必须用 std::filesystem::directory_options::follow_directory_symlink 才能跟随软链接;否则遇到 symlink 会跳过——这点容易被忽略,尤其在跨平台调试时。

基础写法:

for (auto it = std::filesystem::recursive_directory_iterator("/path"); it != std::filesystem::end(it); ++it) {
    std::cout << it->path() << "\n";
}

如何跳过特定子目录(比如 .git、build)

迭代器本身不提供过滤接口,得靠手动判断 it->path().filename()it->path().string(),再配合 it.disable_recursion_pending() 阻止进入当前项(仅对目录有效)。

常见做法:

立即学习C++免费学习笔记(深入)”;

  • 在循环体内检查 it->is_directory()
  • 若目录名匹配黑名单(如 "build"".git"),调用 it.disable_recursion_pending()
  • 注意:该调用只对当前迭代位置生效,必须在 ++it 前执行

示例片段:

天工SkyMusic
天工SkyMusic

基于昆仑万维“天工3.0”打造的AI音乐生成工具,是目前国内唯一公开可用的AI音乐生成大模型

下载
for (auto it = std::filesystem::recursive_directory_iterator("/src"); it != std::filesystem::end(it); ++it) {
    if (it->is_directory()) {
        auto name = it->path().filename().string();
        if (name == ".git" || name == "build" || name == "__pycache__") {
            it.disable_recursion_pending();
            continue;
        }
    }
    std::cout << it->path() << "\n";
}

遍历时抛出 filesystem_error 怎么处理

权限不足、路径被删除、挂载点失效等都会触发 std::filesystem::filesystem_error 异常。默认情况下,迭代器遇到错误会直接 throw,导致遍历中断。

解决方式只有两种:

  • std::filesystem::directory_options::skip_permission_denied 选项构造迭代器,跳过无权访问的条目
  • 捕获异常并重置迭代器(不推荐,因标准未保证异常后迭代器状态可恢复)

安全写法:

try {
    for (auto it = std::filesystem::recursive_directory_iterator(
             "/home/user", std::filesystem::directory_options::skip_permission_denied);
         it != std::filesystem::end(it); ++it) {
        std::cout << it->path() << "\n";
    }
} catch (const std::filesystem::filesystem_error& e) {
    std::cerr << "FS error: " << e.what() << "\n";
}

Windows 下路径分隔符和长路径要注意什么

Windows 默认限制 MAX_PATH=260,而 std::filesystem 在启用 long path 支持的前提下才能处理超过该长度的路径。需要确认两点:

  • 编译时链接器设置:MSVC 需开启 /Zc:wchar_t 和 Unicode 支持
  • 系统级配置:Windows 10+ 要在组策略或注册表中启用 LongPathsEnabled
  • it->path() 返回的是 std::filesystem::path,其 c_str() 在 Windows 上返回 wchar_t*,不能直接传给 ANSI C 函数

跨平台安全输出建议用:

std::wcout << it->path() << L"\n"; // Windows
// 或转为 UTF-8 字符串(需 std::filesystem::path::u8string(),C++20 起)
递归遍历看似简单,但权限控制、符号链接行为、异常恢复、长路径兼容这四点,在真实项目里几乎每次都会踩到至少一个。尤其是 disable_recursion_pending() 的调用时机和 skip_permission_denied 的选项位置,错一个字符就可能漏掉整个子树或 crash。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

443

2025.12.29

自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

640

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

527

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

264

2023.07.24

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

550

2024.04.09

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.8万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号