当前位置: 首页 > news >正文

「C/C++」C++17 之 std::filesystem::recursive_directory_iterator 目录及子目录迭代器

在这里插入图片描述
在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • std::filesystem::recursive_directory_iterator 类详解
      • 1. 引用头文件
      • 2. 注意事项
      • 3. 函数构造与对象初始化
        • 3.1 构造函数
        • 3.2 对象初始化
      • 4. 使用方法
        • 4.1 递归遍历目录
        • 4.2 检查迭代结束
          • 4.3 处理错误代码
        • 5. 总结与应用场景

std::filesystem::recursive_directory_iterator 类详解

1. 引用头文件

要使用 std::filesystem::recursive_directory_iterator 类,首先需要包含 <filesystem> 头文件。这个类是 C++17 引入的 std::filesystem 库的一部分,用于递归地遍历目录中的文件和子目录。

#include <filesystem>

注意:确保你的编译器支持 C++17 或更高版本,并且已经正确设置了编译选项以启用 C++17 标准。

2. 注意事项

  • 命名空间:使用 std::filesystem 命名空间,或者通过 using namespace std::filesystem; 来简化代码。
  • 异常处理:如果提供的路径不存在或无法访问,recursive_directory_iterator 的构造函数可能会抛出异常,如 std::filesystem::filesystem_error
  • 递归深度:虽然标准库没有直接限制递归深度,但过深的目录结构可能会导致栈溢出。因此,在处理深层目录时要特别小心。
  • 跳过权限不足的目录:如果某个目录或文件的权限不足,recursive_directory_iterator 会跳过它,而不会抛出异常。可以通过检查 std::error_code 来识别这种情况。
  • 不可变性recursive_directory_iterator 提供对目录内容的只读访问,不能用于修改目录结构或文件内容。

3. 函数构造与对象初始化

3.1 构造函数

recursive_directory_iterator 类有多个构造函数,但最常用的是接受一个 std::filesystem::path 对象或字符串路径的构造函数。还可以指定一个选项对象来修改迭代器的行为,如跳过符号链接或报告错误代码。

namespace fs = std::filesystem;// 构造一个指向当前目录的递归迭代器
fs::recursive_directory_iterator it1(fs::current_path());// 构造一个指向指定路径的递归迭代器
fs::recursive_directory_iterator it2("/path/to/directory");// 构造一个带有选项的递归迭代器,例如跳过符号链接
fs::directory_options opts = fs::directory_options::skip_permission_denied;
fs::recursive_directory_iterator it3("/path/to/directory", opts);// 默认构造函数,表示迭代结束的状态
fs::recursive_directory_iterator end;
3.2 对象初始化

对象可以通过赋值操作符进行初始化,但需要注意赋值后的迭代器状态。

fs::recursive_directory_iterator it4;
it4 = it1; // 现在 it4 指向与 it1 相同的位置

4. 使用方法

4.1 递归遍历目录

recursive_directory_iterator 可以与范围 for 循环一起使用,方便地递归遍历目录中的文件和子目录。

fs::path dirPath = "/path/to/directory";
for (const auto& entry : fs::recursive_directory_iterator(dirPath)) {std::cout << "Path: " << entry.path() << std::endl;if (entry.is_regular_file()) {std::cout << "  (Regular File)" << std::endl;} else if (entry.is_directory()) {std::cout << "  (Directory)" << std::endl;}// 可以添加更多条件来检查其他类型的文件,如符号链接、块设备等
}
4.2 检查迭代结束

可以使用默认构造的 recursive_directory_iterator 对象作为结束标志,或者使用 == 运算符进行比较。

fs::recursive_directory_iterator it5(dirPath);
while (it5 != end) {std::cout << "Path: " << it5->path() << std::endl;++it5;
}

或者更简洁地,使用范围 for 循环的隐式结束条件(如上所示)。

4.3 处理错误代码

如果需要处理权限不足或其他错误,可以传递一个 std::error_code& 参数给迭代器的构造函数或 status() 方法。

std::error_code ec;
for (const auto& entry : fs::recursive_directory_iterator(dirPath, ec)) {if (ec) {std::cerr << "Error accessing: " << entry.path() << " - " << ec.message() << std::endl;ec.clear(); // 清除错误代码以继续迭代} else {std::cout << "Path: " << entry.path() << std::endl;}
}
5. 总结与应用场景

std::filesystem::recursive_directory_iterator 类是 C++17 文件系统库中的一个强大工具,它允许程序员以简单而高效的方式递归地遍历目录中的文件和子目录。通过构造函数和选项对象,可以灵活地控制迭代器的行为,如跳过符号链接或报告错误代码。

应用场景

  • 深度搜索:在指定目录及其所有子目录中搜索特定文件或文件类型。
  • 统计与报告:生成目录结构的统计报告,如文件数量、文件大小、目录深度等。
  • 权限检查:遍历目录并检查每个文件或目录的权限。
  • 文件同步:在备份、恢复或文件同步过程中,递归地遍历目录以选择或排除特定的文件或子目录。
  • 代码分析:在构建系统或代码分析工具中,递归地遍历源代码目录以处理或分析文件。

通过掌握 std::filesystem::recursive_directory_iterator 类的使用方法,程序员可以更加灵活地处理复杂的文件系统任务,提高代码的可读性和可维护性。


在这里插入图片描述

相关文章:

「C/C++」C++17 之 std::filesystem::recursive_directory_iterator 目录及子目录迭代器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

智能EDA小白从0开始 —— DAY30 冉谱微RFIC-GPT

在科技日新月异的今天&#xff0c;电子设计自动化&#xff08;EDA&#xff09;行业正以前所未有的速度推动着半导体产业的革新与发展&#xff0c;引领着全球电子产业迈向更加智能化、高效化的未来。作为EDA领域的佼佼者&#xff0c;冉谱公司始终站在技术创新的前沿&#xff0c;…...

Android -- 调用系统相册之图片裁剪保存

前言 最近线上反馈&#xff0c;部分vivo手机更换头像时调用系统相册保存图片失败&#xff0c;经本人测试&#xff0c;确实有问题。 经修复后&#xff0c;贴出这块的代码供小伙伴们参考使用。 功能 更换头像选择图片&#xff1a; 调用系统相机拍照&#xff0c;调用系统图片…...

读《道德经》让人感到心胸气闷?董仲舒篡改

为什么读《道德经》会让人感到心胸气闷&#xff1f;难道是董仲舒篡改所致&#xff1f; 作为世界智慧源头的《老子》&#xff0c;享誉古今中外&#xff0c;是世界历史上最伟大的著作之一。 然而&#xff0c;很多人读《道德经》时会感到心胸气闷&#xff0c;这究竟是为什么呢&am…...

D52【python 接口自动化学习】- python基础之模块与标准库

day52 标准库 学习日期&#xff1a;20241029 学习目标&#xff1a;模块与标准库 -- 67 标准库&#xff1a;Python默认提供的便携功能有哪些&#xff1f; 学习笔记 标准库中的常见组件 如何通过官方文档学习标准 from urllib.request import urlopen with urlopen(http://ww…...

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的布匹缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的布匹缺陷检测系统是在 PyTo…...

SQL Server 中,将单行数据转换为多行数据

在 SQL Server 中&#xff0c;将单行数据转换为多行数据通常涉及到将某个字段中的逗号分隔的值拆分成多行。这种操作通常称为“拆分”或“展开”&#xff08;Explode&#xff09;。以下是一些常用的方法来实现这一目标&#xff1a; 1. 使用内置函数 STRING_SPLIT 从 SQL Serv…...

解决数组两数之和问题与逻辑推理找出谋杀案凶手

给定一个整数数组nums和一个整数目标值target(2<nums.length<10^4)&#xff0c;请你在该数组中找出和为目标值target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返…...

uniapp的IOS证书申请(测试和正式环境)及UDID配置流程

1.说明 本教程只提供uniapp在ios端的证书文件申请&#xff08;包含正式环境和开发环境&#xff09;、UDID配置说明&#xff0c;请勿用文档中的账号和其他隐私数据进行测试&#xff0c;请勿侵权&#xff01; 2.申请前准备 证书生成网站&#xff1a;苹果应用上传、解析&#x…...

windows 安装apex_Nvidia Apex安装

参见windows 安装apex_Nvidia Apex安装 重点&#xff1a; 1、在安装前先检查一下&#xff0c;电脑的cuda版本和pytorch内的cuda版本是否一样&#xff0c;不一样的话就把低版本的进行升级&#xff1b; $ git clone https://github.com/NVIDIA/apex$ cd apex2、在保证cuda版本一…...

Laravel5 抓取第三方网站图片,存储到本地

背景 近期发现&#xff0c;网站上的部分图片无法显示&#xff0c; 分析发现&#xff0c;是因为引用的第三方网站图片&#xff08;第三方服务器证书已过期&#xff09; 想着以后显示的方便 直接抓取第三方服务器图片&#xff0c;转存到本地服务器 思路 1. 查询数据表&#xff0…...

DevOps和CI/CD以及在微服务架构中的作用

DevOps 和 CI/CD 是现代软件开发和运维中两个重要的概念,它们之间有紧密的联系,但也有不同的侧重点。以下是对这两个概念的详细介绍和比较。 1. DevOps 定义: DevOps 是一种文化、运动和实践,旨在通过促进开发(Development)和运维(Operations)团队之间的协作,提升软…...

Rust 力扣 - 5. 最长回文子串

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 从中心点先寻找和中心点相等的左右端点&#xff0c;在基于左右端点进行往外扩散&#xff0c;直至左右端点不相等或者越界&#xff0c;然后左右端点这个范围内就是我们找寻的回文串&#xff0c;我们遍历中心点&am…...

DDOS防护介绍

DDoS攻击的基本概念 分布式拒绝服务攻击&#xff08;DDoS&#xff09;是一种网络攻击方式&#xff0c;攻击者通过控制多个被感染的计算机&#xff08;僵尸网络&#xff09;同时向目标服务器发送大量的网络请求&#xff0c;导致目标服务器资源耗尽&#xff0c;无法正常提供服务…...

深入了解 kotlinx-datetime:配置与使用指南

深入了解 kotlinx-datetime&#xff1a;配置与使用指南 在Kotlin多平台开发中&#xff0c;处理日期和时间是常见的需求。kotlinx-datetime库提供了强大且简洁的API来帮助开发者应对这一挑战。本文将详细介绍如何配置kotlinx-datetime库&#xff0c;并通过生动的示例演示其核心…...

Qt编程技巧小知识点(6)根据 *IDN? 对程控仪器连接状态进行确认

文章目录 Qt编程技巧小知识点&#xff08;6&#xff09;根据 *IDN? 对程控仪器连接状态进行确认小结 Qt编程技巧小知识点&#xff08;6&#xff09;根据 *IDN? 对程控仪器连接状态进行确认 确定仪器连接问题&#xff0c;常用的是监测仪器的连接状态&#xff0c;如下代码所示&…...

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时&#xff0c;可以使用 field 来访问或设置…...

机票电子行程单如何批量查验?Java机票电子行程单查验接口示例-发票查验接口

机票电子行程单来了&#xff0c;它方便了人们的出行。现如今&#xff0c;随着旅游、差旅市场的回暖与线上业务的蓬勃发展&#xff0c;机票电子行程单的需求量急剧攀升&#xff0c;如何高效且准确地查验这些电子行程单成为许多企业和财务部门关注的焦点。传统的人工查验流程耗时…...

记录element-ui改造select显示为table,并支持多查询条件

最近遇到的一个需求 &#xff0c; 很有趣&#xff0c;是需要一个select组件&#xff0c;要求显示工号&#xff0c;员工姓名&#xff0c;以及区域 三个字段&#xff0c;并且要支持三个字段的查询。显然element原生的组件不适用&#xff0c;这时候我们需要改造一下&#xff0c;把…...

Spearman、Pearson、Euclidean、Cosine、Jaccard,用来衡量不同数据之间的相似性或差异性

1. Spearman相关系数&#xff1a; 用于衡量两个变量之间的排序关系的强度和方向。Spearman相关系数关注的是两个变量的排序一致性&#xff0c;而不关心具体的数值大小。值的范围为-1到1&#xff0c;1表示完全正相关&#xff0c;-1表示完全负相关&#xff0c;0表示无相关性。常…...

前端开发者福音:用Vue.js开发的Beekeeper Studio,如何让SQL开发体验更‘现代’?

Vue.js与SQL工具的现代融合&#xff1a;Beekeeper Studio如何重塑开发者体验 当SQL开发者第一次打开Beekeeper Studio时&#xff0c;那种流畅的界面过渡和即时的语法补全反馈会让人误以为在使用一个现代Web应用——这恰恰是Vue.js赋予桌面应用的魔力。作为一款基于Electron和Vu…...

从“狗的信”看FPGA设计:工程师的幽默隐喻与EDA实践

1. 从一封“狗的信”到工程师的幽默与哲思那天在EE Times上翻到一篇2011年的老文章&#xff0c;标题是《‘Dear God…’ (From the Dog)》&#xff0c;作者是Clive Maxfield。说实话&#xff0c;在一堆充斥着“3nm工艺”、“HBM4 PHY”、“AI Agent”这些硬核技术词汇的行业新闻…...

为什么92%的AI团队Serverless化失败?奇点大会披露的4个反直觉架构断点与实时熔断方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生Serverless实践&#xff1a;2026奇点智能技术大会无服务器架构 在2026奇点智能技术大会上&#xff0c;AI原生Serverless成为核心范式——它不再将模型推理简单托管于函数即服务&#xff08;FaaS&…...

10分钟搞定:XUnity.AutoTranslator游戏翻译插件终极使用指南

10分钟搞定&#xff1a;XUnity.AutoTranslator游戏翻译插件终极使用指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏看不懂而烦恼吗&#xff1f;XUnity.AutoTranslator正是你需要的游戏…...

ARM GIC中断控制器虚拟化架构与优化实践

1. ARM GIC中断控制器虚拟化架构概述中断控制器是现代计算机系统中至关重要的组件&#xff0c;特别是在虚拟化环境中&#xff0c;高效的中断处理机制直接影响着虚拟机的性能和响应能力。ARM架构的通用中断控制器(GIC)从v3版本开始引入了完整的虚拟化支持&#xff0c;为虚拟机监…...

Docker多阶段构建与镜像优化实战

Docker多阶段构建与镜像优化实战:从1GB到50MB的瘦身之旅 🐳 镜像太大?构建太慢?安全隐患太多?本文通过真实 Node.js + Python 项目,手把手教你用多阶段构建把 Docker 镜像从 1GB 压缩到 50MB,附带完整的优化策略和踩坑指南。 一、为什么你的 Docker 镜像这么大? 很多…...

Butlerclaw:OpenClaw AI Agent的图形化桌面管理工具

1. 项目概述如果你和我一样&#xff0c;对AI Agent的潜力感到兴奋&#xff0c;但又对OpenClaw这类框架复杂的安装、配置和日常管理感到头疼&#xff0c;那么Butlerclaw的出现&#xff0c;绝对是一个值得庆祝的消息。简单来说&#xff0c;Butlerclaw是一个为OpenClaw量身打造的“…...

FPGA/CPLD数字系统设计实战:从器件选型到调试验证的工程指南

1. 从一则行业趣闻聊起&#xff1a;FPGA厂商的“江湖地位”与我们的设计选择前几天翻看一些老旧的行业资料&#xff0c;偶然间又看到了这篇2012年来自EE Times的“陈年旧文”。文章作者Clive Maxfield用他标志性的幽默笔调&#xff0c;聊了一个看似无厘头的话题&#xff1a;将科…...

被AI欺骗啦:一个有趣的三极直接耦合放大电路的调整

简 介&#xff1a; 本文探讨了一个三极直接耦合放大电路的设计问题。初始使用AI工具设计的电路参数看似可行&#xff0c;但仿真显示Q1晶体管处于异常工作状态&#xff08;BC结正向偏置&#xff09;。通过重新调整电阻参数&#xff0c;特别是将反馈电阻R8设为10MΩ后&#xff0c…...

别再傻傻分不清!Ansys Workbench三大建模界面(SCDM/DM/Mechanical)保姆级对比与选用指南

Ansys Workbench三大建模界面深度解析&#xff1a;如何根据项目需求选择最佳工具 在工程仿真领域&#xff0c;Ansys Workbench作为行业标杆软件套件&#xff0c;其内置的三大建模界面——SpaceClaim&#xff08;SCDM&#xff09;、DesignModeler&#xff08;DM&#xff09;和Me…...