C++标准 — C++17特性 — 文件系统 — path 路径处理
类型 path 的对象表示文件系统上的路径。只有路径的语法外观得到处理: 路径名可能表示不存在的路径,或甚至不允许存在于当前文件系统或操作系统的路径。
路径名拥有下列语法:
- root-name(可选):标识具有多个根目录的文件系统(如 “C:” 或 “//myserver”)。有歧义的情况下,将组成合法根名的最长序列当做根名 。标准库可以在 OS API 所了解的根名外,定义额外的根名。
- root-directory(可选):目录分隔符,若存在,则标记此路径为绝对。若缺失(且异于根名的首元素是文件名),则路径为相对且要求另一路径作为解决此文件名的起始位置。
- 包括0个或多个下列语法:
- file-name:不由目录分隔符或偏好目录分隔符组成的字符序列(操作系统或文件系统可能加上附加限制)。此名称可能标识一个文件、硬链接或目录。有两种特殊的文件名需要被识别: .(当前目录),. .(上层目录)。
- directory-separators:正斜杠字符 / 或作为 path::preferred_separator 提供的另一种字符。若重复此字符,则它被处理成单个目录分隔符:/usr///lib 与 /usr/lib 相同。
可以通过下列方法将路径标准化:
- 若路径为空,则停止(空路径的正常形式是空路径);
- 替换每个目录分隔符(可以由多重斜杠组成)为单个 path::preferred_separator;
- 替换根目录名中的每个斜杠字符为 path::preferred_separator;
- 移除每个 . 和紧随其后的目录分隔符;
- 移除每个非 . . 和其后紧随的目录分隔符和 . .;
- 若存在根目录 ,则移除紧随其后的所有 . . 及任何目录分隔符 ;
- 如果最后的文件名是 . .,则移除尾部的所有目录分隔符;
- 如果目录为空,需要加上一个 .。
一、分解
#include <iostream>
#include <filesystem>
using namespace std;
using namespace std::filesystem;
int main()
{
path p("E:/Project/c++/main.cpp");
cout << "path root name is : " << p.root_name() << endl;
cout << "path root directory is : " << p.root_directory() << endl;
cout << "path root path is : " << p.root_path() << endl;
cout << "path relative path is : " << p.relative_path() << endl