C++17中std::filesystem::path的使用

news2024/11/20 20:33:49

      C++17引入了std::filesystem库(文件系统库, filesystem library)。这里整理下std::filesystem::path的使用。
      std::filesystem::path,文件系统路径,提供了对文件系统及其组件(例如路径、常规文件和目录)执行操作的工具。此path类主要用法包括:注意:windows和linux的结果差异:windows上为"\\",而linux上为"/"
      (1).构造函数、operator=、assign:赋值;
      (2).append, operator/=:追加;
      (3).concat, operator+=:连接;
      (4).clear:清除;
      (5).make_preferred:将路径的通用格式视图(generic-format view of the path)中的所有目录分隔符(directory separator)转换为首选目录分隔符,例如,在Windows上,\是首选分隔符,路径foo/bar将被转换为foo\bar;
      (6).remove_filename:删除path中的的文件名;
      (7).replace_filename:将path中的原文件名用另一个文件名替换;
      (8).replace_extension:将path中的原扩展名用另一个扩展名替换;
      (9).swap:交换两个path;
      (10).string:返回path的字符串格式;
      (11).compare:按字典顺序比较两个path;
      (12).root_name, root_directory, root_path:返回path的根名字、根目录、根路径;
      (13).relative_path, parent_path:返回相对根路径的路径、返回父路径的路径;
      (14).filename, extension:返回的文件名、扩展名;
      (15).empty:检查path是否为空;
      (16).has_root_path, has_root_name, has_root_directory, has_relative_path, has_parent_path, has_filename, has_extension:检查root_path、root_name、root_directory、relative_path、parent_path、filename、extension是否为空;
      (17).is_absolute, is_relative:检查path是绝对路径还是相对路径;
      (18).hash_value: 计算path的哈希值;
      (19).operator==, !=, <, <=, >, >=, <=>:按字典顺序比较两个path。

      以下为测试代码:注意windows和linux结果输出的差异

int test_filesystem_path()
{
	namespace fs = std::filesystem;

	// 1. constructs a path
	fs::path p1 = "/usr/lib";
	fs::path p2 = "C:/Program Files";
	fs::path p3("/usr/local");
	
	// 2. operator=
	p1 = p1 / "include"; // move assignment
	p2 = p2 / "NVIDIA GPU Computing Toolkit";
	// windows: p1:"/usr/lib\\include", p2: "C:/Program Files\\NVIDIA GPU Computing Toolkit"
	// linux: p1:"/usr/lib/include", p2: "C:/Program Files/NVIDIA GPU Computing Toolkit" 
	std::cout << "p1:" << p1 << ", p2: " << p2 << std::endl; 

	// 3. assign
	std::cout << "p3: " << p3 << std::endl; // p3: "/usr/local"
	p3.assign("/usr/bin");
	std::cout << "p3: " << p3 << std::endl; // p3: "/usr/bin"

	// 4. append, operator/=
	fs::path p4 = "C:";
	p4.append("Git"); // note: windows: "C:Git" not "C://Git"; linux: "C:/Git"
	p3.append("include");

	p1 /= "include";
	p2 /= "NVIDIA";
	// windows: p4:"C:Git", p3:"/usr/bin\\include", p1:"/usr/lib\\include\\include", p2:"C:/Program Files\\NVIDIA GPU Computing Toolkit\\NVIDIA"
	// linux: p4:"C:/Git", p3:"/usr/bin/include", p1:"/usr/lib/include/include", p2:"C:/Program Files/NVIDIA GPU Computing Toolkit/NVIDIA"
	std::cout << "p4:" << p4 << ", p3:" << p3 << ", p1:" << p1 << ", p2:" << p2 << std::endl;

	// 5. concat, operator+=
	p1 = "";
	p1.concat("var");
	p1 += "lib";
	std::cout << "p1:" << p1 << std::endl; // p1:"varlib"

	// 6. clear
	p1.clear();
	std::cout << "p1:" << p1 << std::endl; // p1:""

	// 7. make_preferred
	p1 = "a\\b\\c";
	p2 = "a/b/c";
	// windows: p1:"a\\b\\c", p2:"a\\b\\c"
	// linux: p1:"a\\b\\c", p2:"a/b/c"
	std::cout << "p1:" << p1.make_preferred() << ", p2:" << p2.make_preferred() << std::endl;

	// 8. remove_filename
	p1 = "C:/Program Files/CUDA";
	p2 = "/usr/local/bin";
	p1 = p1.remove_filename();
	p2 = p2.remove_filename();
	// p1:"C:/Program Files/", p2:"/usr/local/", false, false
	std::cout << "p1:" << p1 << ", p2:" << p2 << std::boolalpha << ", " << p1.has_filename() << ", " << p2.has_filename() << std::endl;

	// 9. replace_filename
	p1 = "C:/Program Files/CUDA";
	p2 = "/usr/local/bin";
	p1.replace_filename("include");
	p2.replace_filename("include");
	// p1:"C:/Program Files/include", p2:"/usr/local/include"
	std::cout << "p1:" << p1 << ", p2:" << p2 << std::endl;

	// 10. replace_extension
	p1 = "C:/Program Files/CUDA.jpg";
	p2 = "/usr/local/lena.jpg";
	p1.replace_extension("bmp");
	p2.replace_extension(".bmp");
	// p1:"C:/Program Files/CUDA.bmp", p2:"/usr/local/lena.bmp"
	std::cout << "p1:" << p1 << ", p2:" << p2 << std::endl;

	// 11. swap
	p1 = "C:/Program Files/CUDA";
	p2 = "/usr/local/bin";
	p1.swap(p2);
	// p1:"/usr/local/bin", p2:"C:/Program Files/CUDA"
	std::cout << "p1:" << p1 << ", p2:" << p2 << std::endl;

	// 12. string
	auto str = p1.string(); // note: cannot be: p1.string().c_str()
	std::cout << "str:" << str.c_str() << std::endl; // str:/usr/local/bin

	// 13. generic_string
	str = p1.generic_string();
	std::cout << "str:" << str << std::endl; // str:/usr/local/bin

	// 14. compare
	p1 = "/usr/abc";
	p2 = "/usr/Abc";
	auto ret1 = p1.compare(p2); // A: 65, a: 97
	auto ret2 = p2.compare(p1);
	// windows: ret1:32, ret2:-32
	// linux: ret1:2097152, ret2:-2097152
	std::cout << "ret1:" << ret1 <<", ret2:" << ret2 << std::endl;

	// 15. root_name, root_directory, root_path, relative_path, parent_path, filename
	fs::path p = fs::current_path();
	// windows: current path:"E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest", 
	//     root name:"E:", root directory:"\\", root path:"E:\\", relative path:"GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest", 
	//     parent path:"E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12", filename:"CppBaseTest"
	// linux: current path:"/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest",
	//     root name:"", root directory:"/", root path:"/", relative path:"home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest",
	//     parent path:"/home/spring/GitCode/Messy_Test/prj", filename:"linux_cmake_CppBaseTest"
	std::cout << "current path:" << p
		<< ", root name:" << p.root_name() << ", root directory:" << p.root_directory()
		<< ", root path:" << p.root_path() << ", relative path:" << p.relative_path()
		<< ", parent path:" << p.parent_path() << ", filename:" << p.filename() << std::endl;

	// 16. stem, extension
	p1 = "E:\\x86_x64_vc12\\CppBaseTest.cpp";
	p2 = "/usr/local/linux.cpp";
	// windows: stem:"CppBaseTest", extension:".cpp"
	// linux: stem:"E:\\x86_x64_vc12\\CppBaseTest", extension:".cpp"
	std::cout << "stem:" << p1.stem() << ", extension:" << p1.extension() << std::endl;
	// stem:"linux", extension:".cpp
	std::cout << "stem:" << p2.stem() << ", extension:" << p2.extension() << std::endl;

	// 17. empty, has_root_path, has_root_name, has_root_directory, has_relative_path, has_parent_path, has_filename, has_stem, has_extension
	p = fs::current_path();
	// windows: false,true,true,true,true,true,true,true,false
	// linux: false,true,false,true,true,true,true,true,false
	std::cout << std::boolalpha << p.empty() << "," << p.has_root_path() << "," << p.has_root_name() << "," << p.has_root_directory()
		<< "," << p.has_relative_path() << "," << p.has_parent_path() << "," << p.has_filename() << "," << p.has_stem() << "," << p.has_extension() << std::endl;

	// 18. is_absolute, is_relative
	p1 = "../../images";
	p2 = "/usr/local";
	p3 = "E:\\x86_x64_vc12";
	p4 = "images/test";
	// windows: false,false,true,false,true,true,false,true
	// linux: false,true,false,false,true,false,true,true
	std::cout << std::boolalpha << p1.is_absolute() << "," << p2.is_absolute() << "," << p3.is_absolute() << "," << p4.is_absolute()
		<< "," << p1.is_relative() << "," << p2.is_relative() << "," << p3.is_relative() << "," << p4.is_relative() << std::endl;

	// 19. begin, end
	p = fs::current_path();
	// windows: current path:"E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest"
	// linux: current path:"/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest"
	std::cout << "current path:" << p << std::endl;
	// windows: "E:" | "\\" | "GitCode" | "Messy_Test" | "prj" | "x86_x64_vc12" | "CppBaseTest" |
	// linux: "/" | "home" | "spring" | "GitCode" | "Messy_Test" | "prj" | "linux_cmake_CppBaseTest" |
	for (auto it = p.begin(); it != p.end(); ++it)
		std::cout << *it << " | ";
	std::cout << std::endl;

	// non-member functions
	// 1. swap
	std::cout << "p1:" << p1 << ", p2:" << p2 << std::endl; // p1:"../../images", p2:"/usr/local"
	fs::swap(p1, p2);
	std::cout << "p1:" << p1 << ", p2:" << p2 << std::endl; // p1:"/usr/local", p2:"../../images"

	// 2. hash_value
	/* windows:
	  541593CE5A744D49 : .. / .. / images
	  E20DE9FA0712ACAC : /usr/local
	  448B5E8D233AB844 : E:\x86_x64_vc12 */
	/* linux:
	  C5561B62D374C247 : ../../images
	  8A5180B805D0D290 : /usr/local
	  D937A950FC185671 : E:\x86_x64_vc12 */
	for (const auto& s : {"../../images", "/usr/local", "E:\\x86_x64_vc12"})
		std::cout << std::hex << std::uppercase << std::setw(16) << fs::hash_value(s) << " : " << s << '\n';

	// 3. operator==,!=,<,<=,>,>=,
	p1 = "image/1.txt";
	p2 = "image/2.txt";
	// true,true
	std::cout << std::boolalpha << (p1 != p2) << "," << (p1.parent_path() == p2.parent_path()) << std::endl;

	// 4. operator/
	p1 = "C:";
	p1 = p1 / "Users" / "admin";
	p2 = "/home";
	p2 = p2 / "local" / "bin";
	// windows: "C:Users\\admin","/home\\local\\bin"
	// linux: "C:/Users/admin","/home/local/bin"
	std::cout << p1 << "," << p2 << std::endl;

	// 5. std::hash: std::hash<std::filesystem::path>{}(p) is equal to std::filesystem::hash_value(p)
	/* windows:
	  541593CE5A744D49 : .. / .. / images
	  E20DE9FA0712ACAC: /usr/local
	  448B5E8D233AB844 : E:\x86_x64_vc12 */
	/* linux:
	  C5561B62D374C247 : ../../images
	  8A5180B805D0D290 : /usr/local
	  D937A950FC185671 : E:\x86_x64_vc12 */
	for (const auto& s : { "../../images", "/usr/local", "E:\\x86_x64_vc12" })
		std::cout << std::hex << std::uppercase << std::setw(16) << std::hash<fs::path>{}(fs::path(s)) << " : " << s << '\n';

	return 0;
}

      执行结果如下图所示:注意:windows和linux输出结果的差异

      GitHub:https://github.com/fengbingchun/Messy_Test

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大众滑雪赛事活动等级划分与评定规范 学习

声明 本文是学习GB-T 42374-2023 大众滑雪赛事活动等级划分与评定规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了大众滑雪赛事活动的等级划分规则&#xff0c;规定了总体要求、评定主体、申报条件、等级评定 要求、结果应…

Linux0.11——第二回 从0x7c00到0x90000

上一讲&#xff0c;讲了CPU执行操作系统的最开始的两行代码&#xff1a; mov ax, 0x07c0 mov ds, ax这两行代码将数据段寄存器 ds 的值变成了 0x07c0&#xff0c;方便之后访问内存时&#xff0c;利用这个段基址进行寻址。 接下来的代码&#xff1a; mov ax,0x9000 mov es,ax…

微服务学习(八):安装JDK

微服务学习&#xff08;八&#xff09;&#xff1a;安装JDK 1、下载JDK 2、将下载后的资源包上传到服务器 3、解压资源包并安装 tar -zxvf jdk-8u371-linux-x64.tar.gz4、配置环境变量 vi /etc/profileexport JAVA_HOME/home/java/jdk1.8.0_371/ export PATH$PATH:$JAVA_HOM…

关于ES5内置函数Object的新方法--Object.create()

在今天的学习中&#xff0c;更深层次的了解了一下ES5中内置函数Object的新方法Object.create(),觉得这个api功能真的十分强大&#xff0c;并且使用的场景也有很多&#xff0c;现和各位同行们分享学习成果&#xff0c;欢迎各位大佬们指正&#xff0c;废话不多说&#xff0c;开整…

git reset origin --hard解决‘Your branch is ahead of ‘origin/xxxx‘ by xx commit.’

git reset origin --hard解决‘Your branch is ahead of origin/xxxx by xx commit.’ 如图&#xff1a; 之前是这么解决的解决git&#xff1a;Your branch is ahead of ‘XXX‘ by X commits-CSDN博客git删除/撤销远已经push到程服务器上某次代码提交场景&#xff1a;不小心把…

InterSystems开发者社区中文版第二届技术征文大赛正式启动!

嗨&#xff0c;开发者们&#xff01; 秋高气爽之际&#xff0c;我们很高兴地宣布启动&#x1f3c6;InterSystems开发者社区中文版第二届技术征文大赛 &#x1f3c6;&#xff08;←点击链接进入参赛页面&#xff09;&#xff01; 从2023年9月19日-10月24日&#xff08;北京时间…

基于微服务的第二课堂管理系统(素质拓展学分管理平台)SpringCloud、SpringBoot 分布式,微服务

基于微服务的第二课堂管理系统 一款真正的企业级开发项目&#xff0c;采用标准的企业规范开发&#xff0c;有项目介绍视频和源码&#xff0c;需要学习的同学可以拿去学习&#xff0c;这是一款真正可以写在简历上的校招项目&#xff0c;能够真正学到东西的一个项目&#xff0c;话…

【论文写作】符号:矩阵、向量的乘法、内积、点积等

【论文写作】符号&#xff1a;矩阵、向量乘法、内积、点积等 文章目录 【论文写作】符号&#xff1a;矩阵、向量乘法、内积、点积等1. 矩阵乘法1.1 矩阵乘积1.2 矩阵哈德玛乘积1.3 矩阵克罗内克积 2. 向量乘法2.1 向量点积、内积2.2 向量Hadamard积2.3 向量外积2.4 向量叉积 1.…

科研之路(2023.9.22)

前言 理解小车底盘代码&#xff0c;为了轨道机器人研究 笔记

2023最新SRC漏洞挖掘快速上手攻略!(小白也能行,真的不试试吗?)

前言 随着网络安全的快速发展&#xff0c;黑客攻击的手段也越来越多样化&#xff0c;因此SRC漏洞挖掘作为一种新的网络安全技术&#xff0c;也在不断发展和完善。那么&#xff0c;作为一个网安小白如果想要入门SRC漏洞挖掘&#xff0c;需要掌握哪些知识呢&#xff1f;以下是本…

深入了解接口测试:方法、工具和关键考虑因素(一)

接口测试是软件测试中的一项重要工作&#xff0c;它涉及到系统与系统之间的交互点。接口可以是外部接口&#xff0c;也可以是内部接口&#xff0c;包括上层服务与下层服务接口以及同级接口。在接口测试中&#xff0c;我们需要确保接口能够按照预期的方式进行通信和交互&#xf…

[JAVAee]Spring MVC

目录 Spring MVC框架 MVC Spring MVC的功能 用户与程序的连接 RequestMapping 指定为Get请求 指定为Post请求 获取参数 单个参数 表单传递多个参数 传递对象 后端参数重命名(后端参数映射) 设置参数必传/非必传 获取JSON对象 获取URL中的参数 上传文件 获取…

FPGA project : DHT11

我犯下的错误&#xff1a; 1&#xff0c;在START状态跳转到REPLAY状态&#xff0c;sda会由高电平跳转到低电平。这个下降沿是传感器产生低电平响应而产生的。而不是传感器准备高电平结束而产生的。 REPLAYtoWAIT_2S ( state_c REPLAY ) && (nege && fl…

Java本地缓存框架Caffeine介绍

Caffeine是一个进程内部缓存框架&#xff0c;使用了Java 8最新的[StampedLock]乐观锁技术&#xff0c;极大提高缓存并发吞吐量&#xff0c;一个高性能的 Java 缓存库&#xff0c;被称为最快缓存。 缓存简介 &#xff08;一&#xff09;缓存对比 从横向对常用的缓存进行对比&a…

(本地安装clickhouse)执行 nstall/doinst.sh时报错: cp: 无法创建普通文件“/usr/bin/clickho

问题描述 在本地安装clickhouse时&#xff0c; 解压&#xff1a;tar -zxvf clickhouse-common-static-21.9.4.35.tgz -C ../module/ 再进入cd clickhouse-common-static-21.9.4.35/ 执行&#xff1a;install/doinst.sh 报错 报错信息和截图&#xff1a; rootbigdata1 click…

【带RL负载的全波桥式整流器】功能齐全的单相非控整流器(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Qt: 鼠标形状设置

设置全局鼠标形状 设置完毕后&#xff0c;整个APP的任何窗体&#xff0c;包括Dialog中的鼠标形状都会被修改为设定类型&#xff0c;某一个控件设定的鼠标形状将被替换。一般不建议使用 QCursor cursor;//创建鼠标对象 cursor.setShape(Qt::CursorShape::ClosedHandCursor);//…

scikit-learn机器学习算法封装

K近邻算法 K-最近邻&#xff08;KNN&#xff09;是一种有监督的机器学习算法&#xff0c;可用于解决分类和回归问题。它基于一个非常简单的想法&#xff0c;数据点的值由它周围的数据点决定。考虑的数据点数量由k值确定。因此&#xff0c;k值是算法的核心。 我们现在已经知道。…

【03】FISCOBCOS配置及使用控制台

官网文档https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html# 配置及使用控制台 第一步. 准备依赖 安装java &#xff08;推荐使用java 14&#xff09; # ubuntu系统安装java sudo apt install -y default-jdk#centos系统安装java sudo yu…