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

C++17 文件与目录操作 <filesystem>

目录

路径操作

目录遍历

文件检查和操作

总结


每次写C++进行目录操作时,我一般都是调平台的SDK,尤其是win32 api 非常难记,于是查一下文档看看有没有和Python中os模块一样好用的库。

于是发现 filesystem,从来没用过(我的第六版C++ primer 最新标准只介绍了C++11)

用法整理如下,仅供参考

当你需要对计算机上的文件和目录进行操作时,C++17标准库中的<filesystem>头文件可以为你提供方便的工具。它提供了一系列的类和函数来处理文件和目录的操作,包括路径操作、目录遍历、文件检查、文件操作等等。本文将为你介绍<filesystem>头文件的使用方法和功能。

当你需要对计算机上的文件和目录进行操作时,C++17标准库中的<filesystem>头文件可以为你提供方便的工具。它提供了一系列的类和函数来处理文件和目录的操作,包括路径操作、目录遍历、文件检查、文件操作等等。本文将为你介绍<filesystem>头文件的使用方法和功能。

路径操作

<filesystem>头文件中的path类用于表示文件或目录的路径。你可以使用各种运算符和函数来操作路径。

首先,你可以使用/运算符来将路径组合起来。例如:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p1 = "C:/Users/";fs::path p2 = "John/Documents/";fs::path p3 = p1 / p2;std::cout << p3 << std::endl;return 0;
}

上面的代码将输出"C:/Users/John/Documents",这是将两个路径组合起来的结果。

你还可以使用+=运算符将路径附加到现有路径上:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p1 = "C:/Users/";fs::path p2 = "John/Documents/";p1 += p2;std::cout << p1 << std::endl;return 0;
}

上面的代码将输出"C:/Users/John/Documents",这是将路径附加到现有路径的结果。

如果你需要比较两个路径,你可以使用==!=运算符来比较它们是否相等:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p1 = "C:/Users/John/Documents/";fs::path p2 = "C:/Users/Jane/Documents/";if (p1 == p2) {std::cout << "The paths are equal" << std::endl;} else {std::cout << "The paths are not equal" << std::endl;}return 0;
}

上面的代码将输出"The paths are not equal",这是因为两个路径不相等。

除了运算符,path类还提供了一些有用的函数来操作路径。例如,你可以使用parent_path()函数来获取路径中的父目录:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents/report.txt";fs::path parent = p.parent_path();std::cout << parent << std::endl;return 0;
}

上面的代码将输出"C:/Users/John/Documents",这是路径中的父目录。

你还可以使用stem()函数来获取路径中的文件名(不包括扩展名):

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents/report.txt";
fs::path filename = p.stem();
std::cout << filename << std::endl;
return 0;
}

上面的代码将输出`"report"`,这是文件名(不包括扩展名)。

如果你需要获取路径中的扩展名,可以使用`extension()`函数:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents/report.txt";fs::path extension = p.extension();std::cout << extension << std::endl;return 0;
}

上面的代码将输出".txt",这是文件的扩展名。

目录遍历

<filesystem>头文件提供了一些函数来遍历目录中的文件和子目录。你可以使用directory_iterator类来遍历目录中的所有内容。例如,下面的代码将遍历目录"C:/Users/John/Documents"中的所有文件和子目录:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents";for (auto& entry : fs::directory_iterator(p)) {std::cout << entry.path() << std::endl;}return 0;
}

上面的代码将输出目录中的所有文件和子目录的路径。

如果你只想遍历目录中的文件,可以使用is_regular_file()函数来判断一个条目是否是一个普通文件:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents";for (auto& entry : fs::directory_iterator(p)) {if (fs::is_regular_file(entry)) {std::cout << entry.path() << std::endl;}}return 0;
}

上面的代码将输出目录中的所有文件的路径。

如果你只想遍历目录中的子目录,可以使用is_directory()函数来判断一个条目是否是一个目录:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents";for (auto& entry : fs::directory_iterator(p)) {if (fs::is_directory(entry)) {std::cout << entry.path() << std::endl;}}return 0;
}

上面的代码将输出目录中的所有子目录的路径。

C++17 的 <filesystem> 标准库提供了获取当前工作目录和创建目录的功能。

获取当前工作目录的方式是通过 std::filesystem::current_path 函数来实现,它返回一个 std::filesystem::path 类型的对象,表示当前工作目录的路径。例如:

#include <filesystem>
#include <iostream>int main() {std::filesystem::path currentPath = std::filesystem::current_path();std::cout << "Current working directory is: " << currentPath << std::endl;return 0;
}

创建目录的方式是通过 std::filesystem::create_directory 函数来实现,它接受一个 std::filesystem::path 类型的对象,表示要创建的目录的路径。例如:

#include <filesystem>
#include <iostream>int main() {std::filesystem::path dirPath = "C:/mydir";if (std::filesystem::create_directory(dirPath)) {std::cout << "Directory created successfully." << std::endl;} else {std::cout << "Failed to create directory." << std::endl;}return 0;
}

文件检查和操作

<filesystem>头文件中的<fstream><iostream>头文件提供了一些函数来检查和操作文件。例如,你可以使用exists()函数来检查文件是否存在:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents/report.txt";if (fs::exists(p)) {std::cout << "The file exists" << std::endl;} else {std::cout << "The file does not exist" << std::endl;}return 0;
}

上面的代码将输出"The file exists",如果文件存在的话。

你可以使用remove()函数来删除文件:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path p = "C:/Users/John/Documents/report.txt";if (fs::exists(p)) {fs::remove(p);std::cout << "The file was successfully deleted" << std::endl;} else {std::cout << "The file does not exist" << std::endl;}return 0;
}

上面的代码将删除文件并输出"The file was successfully deleted",如果文件存在的话。

你也可以使用copy()函数来复制文件:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path source = "C:/Users/John/Documents/report.txt";fs::path target = "C:/Users/John/Documents/report_copy.txt";if (fs::exists(source)) {fs::copy(source, target);std::cout << "The file was successfully copied" << std::endl;} else {std::cout << "The file does not exist" << std::endl;}return 0;
}

上面的代码将复制文件并输出"The file was successfully copied",如果源文件存在的话。

你还可以使用rename()函数来重命名文件:

#include <filesystem>
#include <iostream>namespace fs = std::filesystem;int main() {fs::path old_path = "C:/Users/John/Documents/report.txt";fs::path new_path = "C:/Users/John/Documents/report_renamed.txt";if (fs::exists(old_path)) {fs::rename(old_path, new_path);std::cout << "The file was successfully renamed" << std::endl;} else {std::cout << "The file does not exist" << std::endl;}return 0;
}

上面的代码将重命名文件并输出"The file was successfully renamed",如果原文件存在的话。

总结

<filesystem>头文件提供了一组强大的工具来处理文件系统。你可以使用它来管理文件和目录,获取文件和目录的信息,以及执行文件操作。这些功能使得处理文件和目录变得更加容易,而且可移植性更好,因为<filesystem>头文件可以在多个平台上使用。

相关文章:

C++17 文件与目录操作 <filesystem>

目录 路径操作 目录遍历 文件检查和操作 总结 每次写C进行目录操作时&#xff0c;我一般都是调平台的SDK&#xff0c;尤其是win32 api 非常难记&#xff0c;于是查一下文档看看有没有和Python中os模块一样好用的库。 于是发现 filesystem&#xff0c;从来没用过&#xff0…...

Python 如何安装 MySQLdb ?

人生苦短 我用python Python 标准数据库接口为 Python DB-API&#xff0c; Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库&#xff0c; 你可以选择适合你项目的数据库&#xff1a; GadFlymSQLMySQLPostgreSQLMicrosoft SQL Serve…...

总被程序员坑?你需要了解API接口

编辑导读&#xff1a;程序员是公司里的技术岗&#xff0c;也是产品经理最密切的合作伙伴。但是&#xff0c;程序员能看懂产品经理的工作&#xff0c;产品经理却不一定能明白程序员的工作&#xff0c;因此也常常被无良程序员坑。本文就从API接口的维度&#xff0c;浅析API的概念…...

信息系统基本知识(四)新技术

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.5 新一代技术 1.5.1 物联网 概念&#xff1a;&#xff08;The Internet of Things&#xf…...

jeesite多环境配置

jeesite多环境配置 参考网址&#xff1a; https://blog.csdn.net/shaoming314/article/details/129115912?spm1001.2014.3001.5501 开源项目地址&#xff1a; https://gitee.com/thinkgem/jeesite Spring Spring MVC mybatis Ehcache shiro mysql jsp (主要技术栈) 项目…...

项目中用到的知识点回顾---JWT(JSON Web Token)

1.JWT原理&#xff1a; JWT 的原理是&#xff0c;服务器认证以后&#xff0c;生成一个 JSON 对象&#xff0c;发回给用户&#xff0c;如下&#xff1b; {"姓名": "张三","角色": "管理员","到期时间": "2018年7月1日…...

string类常用函数

1&#xff08;substr函数&#xff09;&#xff1a;字符串截取函数&#xff0c;用于获取字符串的子串&#xff1a; //str.substr(begin&#xff0c;length)&#xff0c;用于截取str中以begin为下标长度为length的字串 string s“asd”; ss.substr(0,1);//结果为a。 2&#xff08…...

hexo静态网站部署到腾讯云cos

hexo支持很多部署方案&#xff0c;最直接的就是部署在GitHub Pages服务上&#xff0c;国内gitee、coding等代码托管平台也都支持静态网站服务&#xff0c;而且免费。 但是GitHub在国内访问不太稳定&#xff0c;国内的代码托管平台资源和服务也不太稳定&#xff0c;后来想了想&…...

Python高性能编程

一、进程池和线程池 1.串行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import time import requests url_lists [ http://www.baidu.com, http://fanyi.baidu.com, http://map.baidu.com, http://music.baidu.com/, http://tieba.baid…...

MVVM模式下如何正确【视图绑定+数据】

概述 我如何&#xff08;不在后面的代码中使用代码&#xff09;自动绑定到我想要的视图&#xff1f;据我了解&#xff0c;如果正确完成&#xff0c;这就是模式应该如何工作。我可以使用主窗口 xaml 中的代码实现这一切&#xff0c;我甚至正确创建了一个资源字典&#xff08;因…...

外包测试3年,离职后成功入职华为,拿到offer的那天我泪目了....

一提及外包测试&#xff0c;大部分人的第一印象就是&#xff1a;工作强度大&#xff0c;技术含量低&#xff0c;没有归属感&#xff01;外包工作三年总体感受就是这份工作缺乏归属感&#xff0c;心里总有一种落差&#xff0c;进步空间不大&#xff0c;接触不到核心技术&#xf…...

Qt Study

按钮->点击->窗口->关闭窗口 connect(信号的发送者&#xff0c;发送具体信号&#xff0c;信号的接收者&#xff0c;信号的处理); 信号处理函数称为槽 信号槽的优点&#xff0c;松散耦合&#xff0c;信号发送端和接收端本身是没有关联的&#xff0c;通过connect连接…...

JS混淆技术探究及解密方法分析

随着Web技术的快速发展&#xff0c;JavaScript被广泛应用于网页开发、移动应用开发等领域。然而&#xff0c;JavaScript代码很容易被反编译、解密&#xff0c;这给保护网站和应用程序的安全性带来了严重的挑战。为了解决这个问题&#xff0c;JS混淆技术应运而生。JS混淆就是将J…...

智慧制硅厂 Web SCADA 生产线

我国目前是全球最大的工业硅生产国、消费国和贸易国&#xff0c;且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识&#xff0c;随着我国“双碳”目标的推进&#xff0c;光伏产业链快速发展&#xff0c;在光伏装机需求的带动下&#xff0c;…...

案例09-数据类型不一致导致equals判断为false

一&#xff1a;背景介绍 在判断课程id和班级id的时候如果一致就像课程信息进行更新&#xff0c;如果不一致就插入一条新的数据。其实两个变量的值是一致的但是类型是不一致的。这就导致数据库中已经有一条这样的数据了&#xff0c;在判断的时候结果为false&#xff0c;就有插入…...

springsecurity中的类

Authentication AuthenticationProvider 每一个AuthenticationProvider对应一个Authentication 很多个AuthenticationProvider 由一个 ProviderManager管理 ProviderManager implements AuthenticationManager 一个ProviderManager有很多个 AuthenticationProvider Usern…...

k8s配置管理

一、configmap 1.1 configmap概述 Configmap 是 k8s 中的资源对象&#xff0c;用于保存非机密性的配置的&#xff0c;数据可以用 key/value 键值对的形式保存&#xff0c;也可通过文件的形式保存。 1.2 configmap作用 我们在部署服务的时候&#xff0c;每个服务都有自己的配置…...

技术官方文档中的代码是用什么展示的?代码高亮插件总结

****内容预警****菜鸟教程***大佬绕道我们经常看到各种技术官方文档&#xff0c;有很多代码展示的区域&#xff0c;用于我们复制粘贴代码&#xff0c;比如vue 的官网当我们需要自己实现这么一个网站的时候&#xff0c;我就开始手忙脚乱&#xff0c;这到底是咋实现的&#xff1f…...

2023年中职组网络安全竞赛——综合渗透测试解析

综合渗透测试 题目如下: PS:需求环境可私信博主,求个三连吧! 解析如下: 通过本地PC中的渗透测试平台KALI2020对服务器场景进行渗透攻击,获取到RSYNC服务所开放的端口,将RSYNC服务开放的端口数值进行MD5加密后作为FLAG提交(如MD5加密前:812);...

【全网最细PAT题解】【PAT乙】1044 火星数字(测试点2,测试点4详细解释)

题目链接 1044 火星数字 题目描述 火星人是以 13 进制计数的&#xff1a;地球人的 0 被火星人称为 tret。 地球人数字 1 到 12 的火星文分别为&#xff1a;jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。 火星人将进位以后的 12 个高位数字分别称为&#xff1a…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...

Flask+LayUI开发手记(八):通用封面缩略图上传实现

前一节做了头像上传的程序&#xff0c;应该说&#xff0c;这个程序编写和操作都相当繁琐&#xff0c;实际上&#xff0c;头像这种缩略图在很多功能中都会用到&#xff0c;屏幕界面有限&#xff0c;绝不会给那么大空间摆开那么大一个界面&#xff0c;更可能的处理&#xff0c;就…...

【学习记录】Office 和 WPS 文档密码破解实战

文章目录 &#x1f4cc; 引言&#x1f4c1; Office 与 WPS 支持的常见文件格式Microsoft Office 格式WPS Office 格式 &#x1f6e0; 所需工具下载地址&#xff08;Windows 官方编译版&#xff09;&#x1f510; 破解流程详解步骤 1&#xff1a;提取文档的加密哈希值步骤 2&…...