std::filesystem::path

来自cppreference.com
 
 
 
 
在标头 <filesystem> 定义
class path;
(C++17 起)

类型 path 的对象表示文件系统上的路径。只有路径的语法外观得到处理:路径名可能表示不存在的路径,或甚至不允许存在于当前文件系统或操作系统的路径。

路径名拥有下列语法:

  1. 根名(可选):标识具有多根的文件系统(如 "C:""//myserver")的根。有歧义的情况下,将组成合法 根名 的最长序列当做 根名。标准库可以在 OS API 所了解的 根名 外,定义额外的 根名
  2. 根目录(可选):目录分隔符,若存在,则标记此路径为绝对。若缺失(且异于根名的首元素是文件名),则路径为相对且要求另一路径作为解决此文件名的起始位置。
  3. 零或多个下列者:
  • 文件名:不由目录分隔符或偏好目录分隔符组成的字符序列(操作系统或文件系统可能加上附加限制)。此名称可能标识一个文件、硬链接或目录。辨别两种特殊的 文件名
  • :由单个点字符 . 构成的文件名是指代当前目录的目录名
  • 点点:由两个点字符 .. 构成的文件名是指代父目录的目录名。
  • 目录分隔符:正斜杠字符 / 或作为 path::preferred_separator 提供的另一种字符。若重复此字符,则它被处理成单个目录分隔符:/usr///////lib/usr/lib 相同。

路径能以下列算法正常化

  1. 若路径为空,则停止(空路径的正常形式是空路径)。
  2. 替换每个 目录分隔符(可以由多重斜杠组成)为单个 path::preferred_separator
  3. 替换 根名 中的每个斜杠字符为 path::preferred_separator
  4. 移除每个 和立即后随的 目录分隔符
  5. 移除每个立即后随 目录分隔符 和一个 点点 的非 点点 文件名,还有立即跟随的 目录分隔符
  6. 若存在 根目录,则移除立即跟随它们的所有 点点 及任何 目录分隔符
  7. 若最终文件名是 点点,则移除任何尾随的 目录分隔符
  8. 若路径为空,则添加一个 ./ 的正常形式是 .)。

路径可由 begin()end() 函数返回的迭代器逐元素进行遍历,这会以通用格式查看路径,并在根名、根目录及后继文件名元素上迭代(跳过目录分隔符,除了标识根目录者)。若路径中的最后元素是目录分隔符,则最后的迭代器将解引用为空元素。

调用任何的 path 非 const 成员函数会令所有引用该对象元素的迭代器失效。

若 OS 使用异于上述可移植通用语法的原生语法,则库函数被定义为接受“受检测格式”,以接受两种格式的路径名:当且仅当受检测格式匹配通用格式,但不为操作系统作为原生路径接受,才采用受检测格式参数。原生格式在目录路径名和文件路径名有别的 OS 上,若通用路径名以目录分隔符终止,则将它当做目录路径,否则当做常规文件。

任何情况下,path 类表现如同它以原生格式存储路径名,并自动于所需场合转换它为通用格式(每个成员函数都指定它转译的路径格式)。

POSIX 系统上,通用格式就是原生格式,并且没有必要区别或转换它们。

路径可隐式转换自及转换成 std::basic_string,这使得在文件 API 上使用它们可行。

流运算符使用 std::quoted 以使空白不会导致其后通过流输入运算符的读取发生截断。

分解成员函数(如 extension)返回 filesystem::path 对象而不是如其他 API 那样返回字符串对象。

目录

[编辑]成员类型

类型 定义
value_type 文件系统原生编码所用的字符类型:POSIX 上为 char,Windows 上为 wchar_t
string_typestd::basic_string<value_type>
const_iteratorvalue_typepath 的常量老式输入迭代器(LegacyInputIterator) ,符合老式双向迭代器(LegacyBidirectionalIterator) 的所有要求,但对于两个相等且可解引用的 const_iterator 类型的迭代器 ab,不要求 *a*b 指代同一对象。

const_iterator 是否实际为老式双向迭代器(LegacyBidirectionalIterator) 是未指定的。

iteratorconst_iterator
确定如何解读路径名的字符串表示

亦定义下列枚举项:

名称 解释
native_format 原生路径格式
generic_format 通用路径格式
auto_format 实现定义格式,如果可能就自动检测

(公开成员枚举)

[编辑]成员常量

constexpr value_type preferred_separator
[静态]
在可移植的 / 之外可用的另一种目录分隔符。Windows 上它是反斜杠字符 \。POSIX 上它是与可移植分隔符相同的斜杠 /
(公开静态成员常量)[编辑]

[编辑]成员函数

构造一个 path
(公开成员函数)[编辑]
销毁 path 对象
(公开成员函数)[编辑]
赋值另一个路径
(公开成员函数)[编辑]
赋值内容
(公开成员函数)[编辑]
连接
以目录分隔符向路径添加元素
(公开成员函数)[编辑]
连接两个路径而不加入目录分隔符
(公开成员函数)[编辑]
修改器
擦除内容
(公开成员函数)[编辑]
转换目录分隔符为首选目录分隔符
(公开成员函数)[编辑]
移除文件名路径组分
(公开成员函数)[编辑]
以另一路径替换最末的路径组分
(公开成员函数)[编辑]
替换扩展名
(公开成员函数)[编辑]
交换两个路径
(公开成员函数)[编辑]
格式观察器
返回路径的原生版本
(公开成员函数)[编辑]
返回转换到字符串的原生路径名格式的路径
(公开成员函数)[编辑]
返回转换到字符串的通用路径名格式
(公开成员函数)[编辑]
比较
以字典序比较两个路径的词法表示
(公开成员函数)[编辑]
生成
转换路径到正常形式
转换路径到相对形式
转换路径到近似形式
(公开成员函数)[编辑]
分解
若存在则返回路径的根名
(公开成员函数)[编辑]
若存在则返回路径的根目录
(公开成员函数)[编辑]
若存在则返回路径的根路径
(公开成员函数)[编辑]
返回相对根路径的路径
(公开成员函数)[编辑]
返回父路径的路径
(公开成员函数)[编辑]
返回文件名路径组分
(公开成员函数)[编辑]
返回主干路径组分(不带扩展名的文件名)
(公开成员函数)[编辑]
返回文件扩展名路径组分
(公开成员函数)[编辑]
查询
检查路径是否为空
(公开成员函数)[编辑]
检查对应路径元素是否非空
(公开成员函数)[编辑]
检查 root_path() 是否唯一标识文件系统位置
(公开成员函数)[编辑]
迭代器
将路径作为元素序列访问的迭代器
(公开成员函数)[编辑]

[编辑]非成员函数

在命名空间 std::filesystem 定义
特化 std::swap 算法
(函数)[编辑]
计算路径对象的散列值
(函数)[编辑]
(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
以字典序比较两个路径
(函数)[编辑]
用目录分隔符连接两个路径
(函数)[编辑]
进行路径上的流输入及输出
(函数)[编辑]
(C++17)(C++20 弃用)
从 UTF-8 编码的源创建 path
(函数)[编辑]

[编辑]辅助类

在命名空间 std 定义
std::filesystem::path 的散列支持
(类模板特化)[编辑]
filesystem::path 的格式化支持
(类模板特化)[编辑]

[编辑]缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3657 C++17 pathhash 被禁用 已启用
close