【C++】filesystem 详解

std::filesystem是 C++17 标准引入的一个强大模块,位于<filesystem>头文件中,提供了与文件系统交互的接口。这些功能包括文件路径操作、目录遍历、文件操作(如复制、删除)以及文件状态查询等。
以下是std::filesystem 的详细介绍:

引入头文件与命名空间

要使用 std::filesystem,需要引入头文件:

#include <filesystem>

为了简化书写,通常会使用以下命名空间别名:

namespace fs = std::filesystem;

核心功能与常用类

  1. std::filesystem::path

表示文件系统中的路径。可以是文件路径或目录路径,支持多种平台(Windows、Linux、macOS)。

常见操作

fs::path p1 = "/usr/local/bin";
fs::path p2 = "file.txt";
fs::path combined = p1 / p2;		// 拼接路径
std::cout << combined.string() << '\n';		// 输出:/usr/local/bin/file.txt// 获取路径信息
std::cout << combined.root_path() << '\n';	// 根路径:"/"
std::cout << combined.parent_path() << '\n';	// 父路径:"/usr/local/bin"
std::cout << combined.filename() << '\n';	// 文件名:"file.txt"
std::cout << combined.extension() << '\n';  // 扩展名:".txt"

转换路径

  • string():返回路径的字符串形式。
  • wstring():返回宽字符串形式(适合 Windows 环境)。
  • u8string():返回 UTF-8 字符串。
  1. 文件状态查询

使用以下函数检查文件或目录的状态:

常用函数

fs::path file_path = "example.txt";if(fs::exists(file_path)) {std::cout << "File exists\n";
}if(fs::is_regular_file(file_path)) {std::cout << "It's a regular file\n"
}if(fs::is_directory(file_path)) {std::cout << "It's a directory\n"
}

函数列表

  • exists:检查文件/目录是否存在。
  • is_regular_file:是否为普通文件。
  • is_directory:是否为目录。
  • is_symlink:是否为符号链接。
  • file_size:获取文件大小。
  1. 创建与删除

创建目录和文件

fs::create_directory("new_dir"); // 创建单个目录
fs::create_directories("parent_dir/child_dir"); // 递归创建目录

删除文件或目录

fs::remove("file.txt");         // 删除文件或空目录
fs::remove_all("parent_dir");   // 删除目录及其内容
  1. 文件复制与重命名

复制文件

fs::copy("source.txt", "destination.txt");

复制目录(递归复制)

fs::copy("source_dir","destination_dir",fs::copy_options::recursive);

重命名或移动

fs::rename("old_name.txt", "new_name.txt");
  1. 目录遍历

遍历目录内容

for (const auto& entry : fs::directory_iterator("some_dir")) {std::cout << entry.path() << '\n';
}

递归遍历目录

for (const auto& entry fs::recursive_directory_iterator("some_dir")) {std::cout << entry.path() << '\n';
}
  1. 文件时间操作

获取文件的修改时间:

fs::path file_path = "example.txt";
auto ftime = fs::last_write_time(file_path);
auto time = decltype(ftime)::clock::to_time_t(ftime);std::cout << "Last modified: " << std::ctime(&time);
  1. 文件权限

检查权限

fs::path file_path = "example.txt";auto perms = fs::status(file_path).permissions();
if ((perms & fs::perms::owner_write) != fs::perms::none) {std::cout << "Owner can write to the file.\n";
}

修改权限

fs::permissions("example.txt", fs::perms::owner_write, fs::perm_options::add);

常用 std::filesystem 枚举类型

  1. std::filesystem::file_type
    • 表示文件类型。
    • 常见值:
      • regular: 普通文件。
      • directory: 目录。
      • symlink: 符号链接。
      • none: 不存在的文件。
  2. std::filesystem::perms
    • 表示文件权限。
    • 常见值:
      • owner_read, owner_write, owner_exec: 所有者权限。
      • group_read, group_write, group_exec: 组权限。
      • others_read, others_write, others_exec: 其他用户权限。
  3. std::filesystem::copy_options
    • 控制复制行为。
    • 常见值:
      • none: 默认行为。
      • overwrite_existing: 覆盖已存在的目标文件。
      • recursive: 递归复制目录。

优点与注意事项
优点

  1. 跨平台支持: 适配不同操作系统文件系统。
  2. 简化代码: 提供直观、易用的接口。
  3. 安全性: 比传统 C 风格的文件操作更安全,避免了路径解析和内存分配问题。

注意事项

  1. 异常处理:
    • std::filesystem 操作可能抛出异常(如路径无效或权限不足)。
    • 应使用 try-catch 块捕获异常。
try {fs::remove("nonexistent_file.txt");
} catch (const fs::filesystem_error& e) {std::cerr << e.what() << '\n';
}
  1. C++17 支持:
    • 确保编译器支持 C++17 或更高版本。
    • 某些早期编译器可能需要额外标志(如 -lstdc++fs)。

总结
std::filesystem 提供了强大的文件系统操作能力,能极大简化文件与目录管理的代码逻辑。以下是典型场景及其对应功能:

场景函数/功能
检查文件或目录是否存在fs::exists
创建或删除目录fs::create_directory / remove
遍历目录内容fs::directory_iterator
文件复制、移动、删除fs::copy / rename / remove
查询文件大小、权限、修改时间fs::file_size / status

通过使用 std::filesystem,程序员可以更高效地完成文件操作,同时保证代码的可移植性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5006.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vitePress】基于github快速添加评论功能(giscus)

一.添加评论插件 使用giscus来做vitepress 的评论模块&#xff0c;使用也非常的简单&#xff0c;具体可以参考&#xff1a;giscus 文档&#xff0c;首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档&#xff0c;如下图所示&#xff0c;填入你的 github 用户…

成就与远见:2024年技术与思维的升华

个人主页&#xff1a;chian-ocean 前言: 2025年1月17日&#xff0c;2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300&#xff0c;虽然与顶尖博主仍有一定差距&#xff0c;但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…

一文了解如何在Qt中间集成Halcon窗口并在子线程显示(附工程源码下载链接)

在基于图像处理的开发中&#xff0c;Halcon作为功能强大的图像处理库&#xff0c;经常需要与Qt结合&#xff0c;以便通过Qt提供的UI功能更好地显示和交互。本文将讲解如何在Qt中集成Halcon窗口&#xff0c;并通过子线程实现Halcon图像的显示&#xff0c;保证主线程的流畅运行。…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

深度学习-89-大语言模型LLM之AI应用开发的基本概念

文章目录 1 什么是智能体(Agent)2 什么是大语言模型(LLM)2.1 LLM的训练及使用2.2 Transformer架构2.3 基于LLM的Agent框架3 什么是检索增强生成(RAG)3.1 RAG是什么3.2 生成式AI应用开发3.3 RAG的整体流程3.4 RAG技术3.4.1 简单RAG(Simple RAG)3.4.2 校正RAG(Corrective RAG)3.4…

电子科大2024秋《大数据分析与智能计算》真题回忆

考试日期&#xff1a;2025-01-08 课程&#xff1a;成电信软学院-大数据分析与智能计算 形式&#xff1a;开卷 考试回忆版 简答题&#xff08;4*15&#xff09; 1. 简述大数据的四个特征。分析每个特征所带来的问题和可能的解决方案 2. HDFS的架构的主要组件有哪些&#xff0…

Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 我们每天都在与各种智能设备打交道&#xff0c;从手机到电脑&#xff0c;再到各种外设&#xff0c;它们已经…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)

文章目录 1.背景2.问题分析3.解决方案3.1解决思路3.2解决过程3.2.1 封装播放组件3.2.2 隐形的视频div3.2.3 截取封面图 3.3 结束 1.背景 有这样一个需求&#xff1a; 给你一个监控列表&#xff0c;每页展示多个监控&#xff08;至少12个&#xff0c;m3u8格式&#xff09;&…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展&#xff0c;GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下&#xff0c;推出了免费版本。接下来&#xff0c;我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型&#xff0c;旨在为软件开发者提供智能化的代…

前端开发Web

Ajax 概念:Asynchronous JavaScriptAnd XML&#xff0c;异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的…

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

ConvBERT:通过基于跨度的动态卷积改进BERT

摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而&#xff0c;BERT严重依赖于全局自注意力机制&#xff0c;因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图&#xff0…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

豆包升级了“眼睛”,看APP截图就能写代码了!超低价让多模态AI普惠

金磊 发自 上海量子位 | 公众号 QbitAI 豆包的“眼睛”升级了&#xff0c;现在让它看一眼APP截图&#xff0c;就能直接给你生成代码&#xff01; 话不多说&#xff0c;我们直接给它上一个难度。 例如我们先随机截取一张网站的图片&#xff1a; 再来到火山方舟的大模型广场&…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前&#xff0c;先弹出隐私协议弹框1.2 上述弹框点击同意&#xff0c;得到如下弹框1.3 点击三个点&#xff0c;然后点设置 1.4 在1.2步骤下&#xff0c;无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

vue3使用音频audio标签

文章目录 一、背景二、页面三、标签介绍四、代码五、代码说明场景1&#xff1a;针对加载固定格式的比如MP3文件&#xff0c;可直接使用\<audio>标签场景2&#xff1a;针对播放告警内容&#xff0c;比如中文或者英文词条情况 一、背景 项目使用vue3&#xff0c;需求针对告…

工业制造离不开的BOM

在制造业的浩瀚星空中&#xff0c;物料清单&#xff08;BOM&#xff09;犹如“北极星”&#xff0c;牢牢指引着产品从设计蓝图迈向实物诞生的全过程。 BOM的分类 按照设计制造的不同阶段&#xff0c;将BOM划分为设计BOM、工艺BOM、制造BOM三种类型。 设计BOM Engineering BO…

【Python】循环语句

while 基本语法格式 while 条件:循环体条件为真, 则执行循环体代码.条件为假, 则结束循环 num 1 while num < 10 :print(num)num 1注&#xff1a; 在 print 函数中&#xff0c;可以使用 end 参数来指定输出结束时使用的字符。默认情况下&#xff0c;end 参数的值为 &qu…