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::ifstream::open 的参数

成员类型与常量

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

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

iterator const_iterator 的别名
确定如何转译路径名的字符串表示

亦定义下列枚举项:

常量 解释
native_format 原生路径格式
generic_format 通用路径格式
auto_format 实现定义格式,可能处自动检测

(枚举)

成员常量

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

成员函数

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

非成员函数

在命名空间 std::filesystem 定义
交换二个路径
(函数)
计算路径对象的哈希值
(函数)
(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
以字典序比较二个路径
(函数)
用目录分隔符连接二个路径
(函数)
进行路径上的流输入及输出
(函数)
(C++17)(C++20 中弃用)
从 UTF-8 编码的源创建 path
(函数)

辅助类

在命名空间 std 定义
std::filesystem::path 的散列支持
(类模板特化)

缺陷报告

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

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