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

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

      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 pathfs::path p1 = "/usr/lib";fs::path p2 = "C:/Program Files";fs::path p3("/usr/local");// 2. operator=p1 = p1 / "include"; // move assignmentp2 = 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. assignstd::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. clearp1.clear();std::cout << "p1:" << p1 << std::endl; // p1:""// 7. make_preferredp1 = "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_filenamep1 = "C:/Program Files/CUDA";p2 = "/usr/local/bin";p1 = p1.remove_filename();p2 = p2.remove_filename();// p1:"C:/Program Files/", p2:"/usr/local/", false, falsestd::cout << "p1:" << p1 << ", p2:" << p2 << std::boolalpha << ", " << p1.has_filename() << ", " << p2.has_filename() << std::endl;// 9. replace_filenamep1 = "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_extensionp1 = "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. swapp1 = "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. stringauto str = p1.string(); // note: cannot be: p1.string().c_str()std::cout << "str:" << str.c_str() << std::endl; // str:/usr/local/bin// 13. generic_stringstr = p1.generic_string();std::cout << "str:" << str << std::endl; // str:/usr/local/bin// 14. comparep1 = "/usr/abc";p2 = "/usr/Abc";auto ret1 = p1.compare(p2); // A: 65, a: 97auto ret2 = p2.compare(p1);// windows: ret1:32, ret2:-32// linux: ret1:2097152, ret2:-2097152std::cout << "ret1:" << ret1 <<", ret2:" << ret2 << std::endl;// 15. root_name, root_directory, root_path, relative_path, parent_path, filenamefs::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, extensionp1 = "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:".cppstd::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_extensionp = fs::current_path();// windows: false,true,true,true,true,true,true,true,false// linux: false,true,false,true,true,true,true,true,falsestd::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_relativep1 = "../../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,truestd::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, endp = 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. swapstd::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 : .. / .. / imagesE20DE9FA0712ACAC : /usr/local448B5E8D233AB844 : E:\x86_x64_vc12 *//* linux:C5561B62D374C247 : ../../images8A5180B805D0D290 : /usr/localD937A950FC185671 : 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,truestd::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 : .. / .. / imagesE20DE9FA0712ACAC: /usr/local448B5E8D233AB844 : E:\x86_x64_vc12 *//* linux:C5561B62D374C247 : ../../images8A5180B805D0D290 : /usr/localD937A950FC185671 : 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

相关文章:

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

C17引入了std::filesystem库(文件系统库, filesystem library)。这里整理下std::filesystem::path的使用。 std::filesystem::path&#xff0c;文件系统路径&#xff0c;提供了对文件系统及其组件(例如路径、常规文件和目录)执行操作的工具。此path类主要用法包括&#x…...

命令模式简介

概念&#xff1a; 命令模式是一种行为设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而允许您将不同的请求参数化、队列化&#xff0c;并且能够在不同的时间点执行。通过引入命令对象&#xff08;Command&#xff09;来解耦发送者&#xff08;Invoker&#xff09;…...

Boost序列化指针

Boost.Serialization 还能序列化指针和引用。 由于指针存储对象的地址&#xff0c;序列化对象的地址没有什么意义&#xff0c;而是在序列化指针和引用时&#xff0c;对象的引用被自动地序列化。 代码 #include <boost/archive/text_oarchive.hpp> #include <boost/…...

NIO简单介绍

一、什么是NIO 1、Java NIO全称java non-blocking IO&#xff0c; 是指JDK提供的新API。从JDK1.4开始&#xff0c;Java提供了一系列改进的输入/输出的新特性&#xff0c;被统称为NIO(即New IO)&#xff0c;是同步非阻塞的 2、NIO有三大核心部分: Channel(通道)&#xff0c; Buf…...

linux进程杀不死

项目场景&#xff1a; 虚拟机 问题描述 linux进程杀不死 无反应 原因分析&#xff1a; 进程僵死zombie 解决方案&#xff1a; 进proc或者find命令找到进程所在地址 cat status查看进程杀死子进程...

5分钟带你搞懂RPA到底是什么?RPA能做什么?

一、RPA的定义 RPA&#xff0c;全称Robotic Process Automation&#xff0c;即机器人流程自动化&#xff0c;是一种软件解决方案&#xff0c;能够模拟人类在计算机上执行的操作&#xff0c;以实现重复性、繁琐任务的自动化。它与传统的计算机自动化有所不同&#xff0c;因为它…...

毫米波雷达 TI IWR1443 在 ROS 中进行 octomap 建图

个人实验记录 /mmwave_ti_ros/ros_driver/src/ti_mmwave_rospkg/launch/1443_multi_3d_0.launch <launch><!-- Input arguments --><arg name"device" value"1443" doc"TI mmWave sensor device type [1443, 1642]"/><arg…...

113双周赛

题目列表 2855. 使数组成为递增数组的最少右移次数 2856. 删除数对后的最小数组长度 2857. 统计距离为 k 的点对 2858. 可以到达每一个节点的最少边反转次数 一、使数组成为递增数组的最少右移次数 这题可以直接暴力求解&#xff0c;枚举出每种右移后的数组&#xff0c;将…...

React 全栈体系(九)

第五章 React 路由 一、相关理解 1. SPA 的理解 单页 Web 应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过 ajax 请求获取, 并在前端…...

阈值化分割,对灰度级图像进行二值化处理(数字图像处理大题复习 P8)

文章目录 画出表格求出灰度直方图 & 山谷画出结果图 画出表格 有几个0就写几&#xff0c;有几个1就写几&#xff0c;如图 求出灰度直方图 & 山谷 跟前面求灰度直方图的方法一样&#xff0c;找出谷底&#xff0c;发现结果为 4 画出结果图 最终的结果就是&#xf…...

vue3中withDefaults是什么

问: const props withDefaults(defineProps<{// 数据列表lotteryList: { pic: string; name?: string }[];// 中奖idwinId: number;// 抽奖初始转动速度initSpeed: number;// 抽奖最快转动速度fastSpeed: number;// 抽奖最慢转动速度slowSpeed: number;// 基本圈数baseCi…...

Android进阶之路 - 盈利、亏损金额格式化

在金融类型的app中&#xff0c;关于金额、数字都相对敏感和常见一些&#xff0c;在此仅记录我在金融行业期间学到的皮毛&#xff0c;如后续遇到新的场景也会加入该篇 该篇大多采用 Kotlin 扩展函数的方式进行记录&#xff0c;尽可能熟悉 Kotlin 基础知识 兄弟 Blog StringUti…...

工业蒸汽量预测(速通一)

工业蒸汽量预测&#xff08;一&#xff09; 赛题理解1、评估指标2、赛题模型3、解题思路 理论知识1、变量识别2、变量分析3、缺失值处理4、异常值处理5、变量转换6、新变量生成 数据探索1、导包2、读取数据3、查看数据4、可视化数据分布4.1箱型图4.2获取异常数据并画图4.3直方图…...

机器学习的主要内容

分类任务 回归任务 有一些算法只能解决回归问题有一些算法只能解决分类问题有一些算法的思路既能解决回归问题&#xff0c;又能解决分类问题 一些情况下&#xff0c; 回归任务可以转化为分类任务&#xff0c; 比如我们预测学生的成绩&#xff0c;然后根据学生的成绩划分为A类、…...

华为OD机试真题-分积木-2023年OD统一考试(B卷)

题目描述: Solo和koko是两兄弟,妈妈给了他们一大堆积木,每块积木上都有自己的重量。现在他们想要将这些积木分成两堆。哥哥Solo负责分配,弟弟koko要求两个人获得的积木总重量“相等”(根据Koko的逻辑),个数可以不同,不然就会哭,但koko只会先将两个数转成二进制再进行加…...

SpringBoot自动装配原理及分析

一、什么是自动装配 在使用SpringBoot的时候&#xff0c;会自动将Bean装配到IoC容器中。例如我们在使用Redis数据库的时候&#xff0c;会引入依赖spring-boot-starter-data-redis。在引入这个依赖后&#xff0c;服务初始化的时候&#xff0c;会将操作Redis需要的组件注入到IoC…...

Android开发笔记 :理解Fragment

Android开发笔记&#xff1a;理解Fragment 导言 本篇文章产生的原因很简单&#xff0c;就是我在了解Android Jetpack中的Lifecycle框架时发现Lifecycle具体时间和状态的更新都是由一个名为ReportFragment的Fragment来跟踪的&#xff0c;为了更好的了解Fragment是如何追踪Activ…...

std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳

当前时间戳获取方法 先使用std::chrono获取当前系统时间&#xff0c;然后将当前系统时间转换为纪元时间std::time_t类型&#xff0c;之后使用std::localtime对std::time_t类型转换为本地时间结构体std::tm类型&#xff0c;最后使用strftime对时间进行格式化输出。 其中std::t…...

sh文件介绍及linux下执行

Shell脚本是一种用于自动化任务和系统管理的脚本语言。它允许用户通过命令行界面执行一系列命令&#xff0c;从而简化了重复性任务的处理过程。 以下是关于Shell脚本的一些基本概念&#xff1a; 1. Shell脚本通常以“.sh”扩展名保存&#xff0c;例如“script.sh”。 2. Shell…...

js-cookie使用 js深度克隆(判断引用类型是数组还是对象的方法)

cookie和深度拷贝的使用 1、js-cookie使用2、js深度克隆 1、js-cookie使用 前端的本地存储分为 localstorage、sesstionstorage、cookie 但是咱们有时候需要做7天免登录的需求时&#xff0c;选择 cookie 作为前端的本地存储是在合适不过的了 直接操作 cookie 可以&#xff0c; …...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...