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

深入探索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的主要特点包括:

  1. 跨平台支持std::filesystem能够在多个平台上工作,包括Windows、Linux和macOS。
  2. 异常处理std::filesystem提供了基于异常的错误处理机制,简化了错误处理流程。
  3. 高效性std::filesystem的实现非常高效,能够处理大规模的文件系统操作。
  4. 现代C++特性std::filesystem充分利用了C++11及以后的特性,如autodecltypemove语义等。

二、核心功能详解

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_iteratorrecursive_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++的特性,例如autodecltypemove语义等。

示例:使用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编程中&#xff0c;文件系统操作是许多应用程序的基础功能之一。无论是读写文件、创建目录&#xff0c;还是遍历文件系统&#xff0c;文件系统操作几乎无处不在。然而&#xff0c;在C17之前&#xff0c;标准库并没有提供一个统一、高效且易用的文件系统操作接口。开发…...

LLM | 论文精读 | GIS Copilot : 面向空间分析的自主GIS代理

论文标题&#xff1a;GIS Copilot: Towards an Autonomous GIS Agent for Spatial Analysis 作者&#xff1a;Temitope Akinboyewa&#xff0c;Zhenlong Li&#xff0c;Huan Ning&#xff0c;M. Naser Lessani等 来源&#xff1a;arXiv DOI&#xff1a;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总结 前言 众所周知&#xff0c;Ubuntu下安装git只需执行sudo apt install git即可使用默认终端拉取代码&#xff0c;但是Windows上使用git既没有linux便捷&#xff0c;又没有MacOS优雅…...

基于Java+SpringCloud+Vue的前后端分离的房产销售平台

基于JavaSpringCloudVue的前后端分离的房产销售平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x…...

以影像技术重构智能座舱体验,开启驾乘互动新纪元

在汽车智能化浪潮席卷全球的今天&#xff0c;座舱体验早已突破传统驾驶功能的边界&#xff0c;成为车企竞争的核心赛道。美摄科技凭借其在图像处理与AI算法领域的深厚积累&#xff0c;推出全链路智能汽车图像及视频处理方案&#xff0c;以创新技术重新定义车载影像系统&#xf…...

deepseek在pycharm 中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm&#xff0c;如何接入deepseek是我们窥探ai代码编写的第一步&#xff0c;熟悉起来总没坏处。 1、官网安装pycharm社区版&#xff08;免费&#xff09;&#xff0c;如果需要安装专业版&#xff0c;需要另外找破解码。 2、安装Ollama…...

LLM大型语言模型(一)

1. 什么是 LLM&#xff1f; LLM&#xff08;大型语言模型&#xff09;是一种神经网络&#xff0c;专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络&#xff0c;通常训练于海量文本数据上&#xff0c;有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …...

尚庭公寓项目记录

数据库准备 保留图像时&#xff0c;保存图像地址就可以数据表不是越多越好&#xff0c;可以用中间表来实现俩个表之间的联立这样方便查数据但是却带来性能问题而减少表的jion但是提高性能&#xff0c;以冗余来换去性能采用MySQL&#xff0c;InnoDB存储引擎物理删除和逻辑删除逻…...

飞算JavaAI编程工具集成到idea中

AI插件介绍 飞算AI的插件下载地址&#xff0c;里边也有安装步骤&#xff1a; JavaAI 以上图是不是看着很牛的样子&#xff0c;一下成为高手确实说的太夸张了点&#xff0c; 一键生成后端JavaWeb项目还是挺方便的。 飞算JavaAI插件安装 Idea->>file->>setting-&…...

【每日八股】计算机网络篇(二):TCP 和 UDP

目录 TCP 的头部结构&#xff1f;TCP 如何保证可靠传输&#xff1f;1. 确认应答机制2. 超时重传3. 数据排序与去重4. 流量控制5. 拥塞控制6. 校验和 TCP 的三次握手&#xff1f;第一次握手第二次握手第三次握手 TCP 为什么要三次握手&#xff1f;问题一&#xff1a;防止历史连接…...

课程《MIT Introduction to Deep Learning》

在Youtubu上&#xff0c;MIT Introduction to Deep Learning (2024) | 6.S191 共8节课&#xff1a; (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 源代码时&#xff0c;先会通过宏处理&#xff0c;形成 一个叫转译单元&#xff08;translation_unit&#xff09;&#xff0c;接着进行语法分析&#xff0c;C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…...

UI组件库及antd

什么是UI组件库及antd安装 随着商业化的趋势&#xff0c;企业级产品中需求多且功能复杂&#xff0c;且变动和并发频繁&#xff0c;常常需要设计者与开发者快速做出响应&#xff0c;同时这类产品中有很多类似的页面及组件&#xff0c;可以通过抽象得到一些稳定且高复用性的内容…...

Windows下使用ShiftMediaProject方法编译FFmpeg

Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0&#xff01;或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…...

【计算机网络入门】TCP拥塞控制

目录 1. TCP拥塞控制和TCP流量控制的区别 2. 检测到拥塞该怎么办 2.1 如何判断网络拥塞&#xff1f; 3. 慢开始算法 拥塞避免算法 4.快重传事件->快恢复算法 5. 总结 1. TCP拥塞控制和TCP流量控制的区别 TCP流量控制是控制端对端的数据发送量。是局部的概念。 TCP拥…...

无人机遥控器无线传输技术解析!

一、主流无线传输方式 无线电遥控系统&#xff08;2.4GHz/5.8GHz频段&#xff09; 频段特性&#xff1a;2.4GHz频段穿透力强、覆盖距离远&#xff08;可达2公里以上&#xff09;&#xff0c;适合控制信号传输&#xff1b;5.8GHz频段带宽更高&#xff0c;适用于高清视频流&…...

修改hosts文件,修改安全属性,建立自己的DNS

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

MySQL零基础教程16—表连接进阶

复习表别名 之前已经学习过&#xff0c;查询的时候可以使用as来对检索的列进行重命名&#xff0c;这样可以让sql更加简介&#xff0c;增强易读性&#xff08;as可以省略&#xff09; 此外&#xff0c;使用表别名还可以支持在一条select语句中&#xff0c;一个表是被多次使用 …...

springboot+vue基于web的药店管理系统 药品商城在线购药系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 后台管理系统&#xff08;SpringBoot&…...

Kafka消费者组避坑指南:从位移提交到重平衡的实战经验

Kafka消费者组实战避坑指南&#xff1a;从位移管理到重平衡优化 在分布式消息系统中&#xff0c;Kafka消费者组的稳定性直接决定了数据处理的可靠性。我曾亲眼见证过一个电商大促场景下&#xff0c;由于消费者组配置不当导致百万级订单积压的故障。本文将分享七个关键场景的深度…...

掌握罗技鼠标宏的5个技术维度:从原理到实战优化

掌握罗技鼠标宏的5个技术维度&#xff1a;从原理到实战优化 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 一、技术原理解析&#xff1a;机械补…...

DOL-CHS-MODS:开源工具助力游戏体验一键优化

DOL-CHS-MODS&#xff1a;开源工具助力游戏体验一键优化 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 您是否在为游戏汉化过程中的繁琐配置而头疼&#xff1f;是否曾因美化补丁安装不当导致游戏崩…...

InternLM2-Chat-1.8B助力在线教育:个性化作业批改与学习反馈生成

InternLM2-Chat-1.8B助力在线教育&#xff1a;个性化作业批改与学习反馈生成 1. 引言&#xff1a;当作业批改遇上AI 想象一下&#xff0c;一位老师深夜还在批改几十份、甚至上百份学生作业。面对相似的错误&#xff0c;需要一遍遍写下相同的评语&#xff1b;面对有潜力的答案…...

零成本打造私有云盘:从PHPStudy安装到IPv6动态域名解析全攻略

零成本打造私有云盘&#xff1a;从PHPStudy安装到IPv6动态域名解析全攻略 在数字化时代&#xff0c;个人数据存储需求呈爆炸式增长。网盘限速、隐私泄露、订阅费用高昂等问题困扰着许多用户。本文将手把手教你如何利用闲置电脑和免费工具&#xff0c;打造一个完全由自己掌控的私…...

一键部署后的第一步:LiuJuan20260223Zimage API调用详解与调试

一键部署后的第一步&#xff1a;LiuJuan20260223Zimage API调用详解与调试 刚在星图GPU平台上一键部署好LiuJuan20260223Zimage镜像&#xff0c;看着运行状态显示“正常”&#xff0c;是不是感觉离用上强大的AI能力只差临门一脚了&#xff1f;别急&#xff0c;这最后一步——学…...

Carsim与Matlab Simulink联合仿真四轮电动汽车转向容错控制模型

Carsim与matlab/simulink联合仿真&#xff0c;线控转向&#xff0c;四轮电动汽车转向失效容错控制模型&#xff0c;提供参考文献 线控转向系统&#xff08;Steer-by-Wire&#xff09;在四轮独立驱动电动汽车中的应用越来越火&#xff0c;但转向失效问题始终是悬在工程师头上的…...

Qwen1.5-0.5B-Chat实战部署:Docker容器化改造方案

Qwen1.5-0.5B-Chat实战部署&#xff1a;Docker容器化改造方案 本文介绍如何将基于ModelScope的Qwen1.5-0.5B-Chat对话服务进行Docker容器化改造&#xff0c;实现一键部署和跨平台运行。 1. 项目概述与核心价值 Qwen1.5-0.5B-Chat是阿里通义千问开源系列中最轻量的对话模型&…...

CA6140车床拨叉831003加工工艺及铣左端面夹具设计【说明书+CAD图纸+SW三维】

CA6140车床拨叉831003作为机床传动系统中的关键零件&#xff0c;其加工质量直接影响设备运行的稳定性。该零件的加工工艺需兼顾尺寸精度与表面粗糙度要求&#xff0c;重点在于左端面的铣削加工。传统工艺方案多采用通用夹具定位&#xff0c;存在装夹效率低、重复定位精度差等问…...