深入探索C++17文件系统库:std::filesystem全面解析

前言
在C++编程中,文件系统操作是许多应用程序的基础功能之一。无论是读写文件、创建目录,还是遍历文件系统,文件系统操作几乎无处不在。然而,在C++17之前,标准库并没有提供一个统一、高效且易用的文件系统操作接口。开发者们不得不依赖于平台特定的API,或者使用第三方库,这不仅增加了代码的复杂性,也降低了代码的可移植性。
C++17引入了std::filesystem库,这是一个全新的文件系统操作库,旨在提供一个跨平台、高效且易用的文件系统操作接口。通过std::filesystem,开发者可以方便地进行文件和目录的操作,处理文件路径,获取文件属性等。这个库的引入极大地提升了C++在文件系统操作方面的能力,使得C++程序员能够更专注于业务逻辑的实现,而不必为平台差异和文件系统操作的细节烦恼。
本文将全面介绍std::filesystem库的功能和使用方法,通过丰富的代码示例和详细的解释,帮助读者快速掌握这一重要的C++17特性。
文章目录
- 前言
- 一、std::filesystem概述
- 二、核心功能详解
- 1. 文件和目录操作
- 2. 路径操作
- 3. 文件属性操作
- 4. 遍历目录
- 5. 对现代C++的支持
- 6. 异常处理
- 7. 跨平台支持
- 总结
一、std::filesystem概述
std::filesystem是一个C++17新增的库,主要用于文件系统操作。它提供了一个跨平台的接口,允许开发者以统一的方式处理文件和目录操作。std::filesystem的核心在于其path类和filesystem命名空间中的各种函数,这些函数可以帮助我们完成文件和目录的创建、删除、复制、移动等操作。
std::filesystem的主要特点包括:
- 跨平台支持:
std::filesystem能够在多个平台上工作,包括Windows、Linux和macOS。 - 异常处理:
std::filesystem提供了基于异常的错误处理机制,简化了错误处理流程。 - 高效性:
std::filesystem的实现非常高效,能够处理大规模的文件系统操作。 - 现代C++特性:
std::filesystem充分利用了C++11及以后的特性,如auto、decltype、move语义等。
二、核心功能详解
1. 文件和目录操作
std::filesystem提供了丰富的文件和目录操作接口,包括文件的创建、删除、复制、移动等。以下是一些常用的函数:
exists(): 检查文件或目录是否存在。create_directories(): 创建目录,包括父目录。remove(): 删除文件或目录。copy(): 复制文件或目录。rename(): 重命名文件或目录。resize_file(): 调整文件大小。
示例:创建目录和文件
#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {// 创建一个目录fs::path dir_path("example_dir");if (!fs::exists(dir_path)) {fs::create_directories(dir_path);std::cout << "Directory created: " << dir_path << std::endl;}// 创建一个文件fs::path file_path("example_dir/example_file.txt");if (!fs::exists(file_path)) {std::ofstream(file_path).close();std::cout << "File created: " << file_path << std::endl;}return 0;
}

2. 路径操作
std::filesystem提供了path类来处理文件路径。path类允许我们以一种平台无关的方式处理文件路径,例如提取文件名、扩展名、父路径等。
filename(): 获取文件名。extension(): 获取文件扩展名。parent_path(): 获取父路径。root_name(): 获取根名称(如Windows上的驱动器号)。relative(): 获取相对路径。lexically_normal(): 规范化路径。
示例:路径操作
#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path path("/usr/local/include/example.hpp");std::cout << "File name: " << path.filename() << std::endl;std::cout << "File extension: " << path.extension() << std::endl;std::cout << "Parent path: " << path.parent_path() << std::endl;std::cout << "Root name: " << path.root_name() << std::endl;return 0;
}

3. 文件属性操作
std::filesystem提供了多种函数来获取文件的属性,例如文件大小、文件类型、权限等。
file_size(): 获取文件大小。is_regular_file(): 检查是否是普通文件。is_directory(): 检查是否是目录。last_write_time(): 获取文件的最后写入时间。permissions(): 获取文件权限。
示例:获取文件属性
#include <filesystem>
#include <iostream>
#include <chrono>namespace fs = std::filesystem;int main() {fs::path file_path("example_file.txt");if (fs::exists(file_path)) {if (fs::is_regular_file(file_path)) {std::cout << "File size: " << fs::file_size(file_path) << " bytes" << std::endl;}}return 0;
}
4. 遍历目录
std::filesystem提供了directory_iterator和recursive_directory_iterator来遍历目录。directory_iterator用于遍历当前目录,而recursive_directory_iterator用于递归遍历目录。
directory_iterator: 遍历目录。recursive_directory_iterator: 递归遍历目录。
示例:遍历目录
#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path dir_path("example_dir");if (fs::exists(dir_path)) {for (const auto& entry : fs::directory_iterator(dir_path)) {if (fs::is_regular_file(entry.path())) {std::cout << "File: " << entry.path().filename() << std::endl;} else if (fs::is_directory(entry.path())) {std::cout << "Directory: " << entry.path().filename() << std::endl;}}}return 0;
}

5. 对现代C++的支持
std::filesystem充分利用了现代C++的特性,例如auto、decltype、move语义等。
示例:使用auto和decltype
#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {auto path = fs::current_path();decltype(path) dir_path = path / "example_dir";if (!fs::exists(dir_path)) {fs::create_directories(dir_path);std::cout << "Directory created: " << dir_path << std::endl;}return 0;
}
6. 异常处理
std::filesystem提供了基于异常的错误处理机制。文件系统操作可能会抛出filesystem_error异常。
filesystem_error: 文件系统操作异常。
示例:异常处理
#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path file_path("example_file.txt");try {if (fs::exists(file_path)) {fs::remove(file_path);std::cout << "File removed: " << file_path << std::endl;}} catch (const fs::filesystem_error& e) {std::cerr << "Error: " << e.what() << std::endl;}return 0;
}
7. 跨平台支持
std::filesystem能够在多个平台上工作,包括Windows、Linux和macOS。它能够处理不同平台的文件系统差异,例如路径分隔符、权限等。
示例:跨平台支持
#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path path("example_dir/example_file.txt");if (fs::exists(path)) {std::cout << "File exists: " << path << std::endl;} else {std::cout << "File does not exist: " << path << std::endl;}return 0;
}
总结
std::filesystem是C++17引入的一个强大且易用的文件系统操作库。它提供了跨平台的文件系统操作接口,简化了文件和目录操作的代码实现。通过std::filesystem,开发者可以高效、安全地处理文件系统操作,同时利用现代C++的特性,提升代码的可读性和可维护性。
在本文中,我们详细介绍了std::filesystem的核心功能,包括文件和目录操作、路径操作、文件属性操作、遍历目录、对现代C++的支持、异常处理以及跨平台支持。通过丰富的代码示例,我们展示了如何在实际项目中使用std::filesystem库。
希望本文能够帮助读者快速掌握std::filesystem的使用,并在实际开发中发挥其潜力。
相关文章:
深入探索C++17文件系统库:std::filesystem全面解析
前言 在C编程中,文件系统操作是许多应用程序的基础功能之一。无论是读写文件、创建目录,还是遍历文件系统,文件系统操作几乎无处不在。然而,在C17之前,标准库并没有提供一个统一、高效且易用的文件系统操作接口。开发…...
LLM | 论文精读 | GIS Copilot : 面向空间分析的自主GIS代理
论文标题:GIS Copilot: Towards an Autonomous GIS Agent for Spatial Analysis 作者:Temitope Akinboyewa,Zhenlong Li,Huan Ning,M. Naser Lessani等 来源:arXiv DOI:10.48550/arXiv.2411.…...
Unity 适用Canvas 为任一渲染模式的UI 拖拽
RectTransformUtility-ScreenPointToWorldPointInRectangle - Unity 脚本 API 将一个屏幕空间点转换为世界空间中位于给定RectTransform 平面上的一个位置。 实现 获取平面位置。 parentRT transform.parent as RectTransform; 继承IPointerDownHandler 和IDragHandler …...
基于遗传算法的无人机三维路径规划仿真步骤详解
基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...
windows下使用Hyper+wsl实现ubuntu下git的平替
文章目录 前言一、安装Hyper、wsl1. 安装Hyper2. 安装wsl 二、配置Hyper三、安装并使用git总结 前言 众所周知,Ubuntu下安装git只需执行sudo apt install git即可使用默认终端拉取代码,但是Windows上使用git既没有linux便捷,又没有MacOS优雅…...
基于Java+SpringCloud+Vue的前后端分离的房产销售平台
基于JavaSpringCloudVue的前后端分离的房产销售平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#x…...
以影像技术重构智能座舱体验,开启驾乘互动新纪元
在汽车智能化浪潮席卷全球的今天,座舱体验早已突破传统驾驶功能的边界,成为车企竞争的核心赛道。美摄科技凭借其在图像处理与AI算法领域的深厚积累,推出全链路智能汽车图像及视频处理方案,以创新技术重新定义车载影像系统…...
deepseek在pycharm 中的配置和简单应用
对于最常用的调试python脚本开发环境pycharm,如何接入deepseek是我们窥探ai代码编写的第一步,熟悉起来总没坏处。 1、官网安装pycharm社区版(免费),如果需要安装专业版,需要另外找破解码。 2、安装Ollama…...
LLM大型语言模型(一)
1. 什么是 LLM? LLM(大型语言模型)是一种神经网络,专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络,通常训练于海量文本数据上,有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …...
尚庭公寓项目记录
数据库准备 保留图像时,保存图像地址就可以数据表不是越多越好,可以用中间表来实现俩个表之间的联立这样方便查数据但是却带来性能问题而减少表的jion但是提高性能,以冗余来换去性能采用MySQL,InnoDB存储引擎物理删除和逻辑删除逻…...
飞算JavaAI编程工具集成到idea中
AI插件介绍 飞算AI的插件下载地址,里边也有安装步骤: JavaAI 以上图是不是看着很牛的样子,一下成为高手确实说的太夸张了点, 一键生成后端JavaWeb项目还是挺方便的。 飞算JavaAI插件安装 Idea->>file->>setting-&…...
【每日八股】计算机网络篇(二):TCP 和 UDP
目录 TCP 的头部结构?TCP 如何保证可靠传输?1. 确认应答机制2. 超时重传3. 数据排序与去重4. 流量控制5. 拥塞控制6. 校验和 TCP 的三次握手?第一次握手第二次握手第三次握手 TCP 为什么要三次握手?问题一:防止历史连接…...
课程《MIT Introduction to Deep Learning》
在Youtubu上,MIT Introduction to Deep Learning (2024) | 6.S191 共8节课: (1) MIT Introduction to Deep Learning (2024) | 6.S191 (2) MIT 6.S191: Recurrent Neural Networks, Transformers, and Attention (3) MIT 6.S191: Convolutional Neural N…...
GCC RISCV 后端 -- C语言语法分析过程
在 GCC 编译一个 C 源代码时,先会通过宏处理,形成 一个叫转译单元(translation_unit),接着进行语法分析,C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…...
UI组件库及antd
什么是UI组件库及antd安装 随着商业化的趋势,企业级产品中需求多且功能复杂,且变动和并发频繁,常常需要设计者与开发者快速做出响应,同时这类产品中有很多类似的页面及组件,可以通过抽象得到一些稳定且高复用性的内容…...
Windows下使用ShiftMediaProject方法编译FFmpeg
Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0!或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…...
【计算机网络入门】TCP拥塞控制
目录 1. TCP拥塞控制和TCP流量控制的区别 2. 检测到拥塞该怎么办 2.1 如何判断网络拥塞? 3. 慢开始算法 拥塞避免算法 4.快重传事件->快恢复算法 5. 总结 1. TCP拥塞控制和TCP流量控制的区别 TCP流量控制是控制端对端的数据发送量。是局部的概念。 TCP拥…...
无人机遥控器无线传输技术解析!
一、主流无线传输方式 无线电遥控系统(2.4GHz/5.8GHz频段) 频段特性:2.4GHz频段穿透力强、覆盖距离远(可达2公里以上),适合控制信号传输;5.8GHz频段带宽更高,适用于高清视频流&…...
修改hosts文件,修改安全属性,建立自己的DNS
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
MySQL零基础教程16—表连接进阶
复习表别名 之前已经学习过,查询的时候可以使用as来对检索的列进行重命名,这样可以让sql更加简介,增强易读性(as可以省略) 此外,使用表别名还可以支持在一条select语句中,一个表是被多次使用 …...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
