std::filesystem::path::lexically_normal, std::filesystem::path::lexically_relative, std::filesystem::path::lexically_proximate
来自 cppreference.com
< cpp | filesystem | path
path lexically_normal() const; |
(1) | (自 C++17 起) |
path lexically_relative( const path& base ) const; |
(2) | (自 C++17 起) |
path lexically_proximate( const path& base ) const; |
(3) | (自 C++17 起) |
2) 返回 *this 相对于 base 的相对路径。
- 首先,如果 root_name() != base.root_name() 为 true 或 is_absolute() != base.is_absolute() 为 true 或 (!has_root_directory() && base.has_root_directory()) 为 true 或 relative_path() 或 base.relative_path() 中的任何文件名可以解释为 根名称,则返回一个默认构造的路径。
- 否则,首先确定 *this 和 base 的第一个不匹配元素,就像通过 auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()) 一样,然后
- 如果 a == end() 且 b == base.end(),则返回 path("."),
- 否则,定义 N 为 [b, base.end()) 中的非空文件名元素的数量,这些元素既不是 点 也不 点-点,减去 点-点 文件名元素的数量,如果 N < 0,则返回一个默认构造的路径,
- 否则,如果 N = 0 且 a == end() || a->empty(),则返回 path("."),
- 否则返回一个由以下内容组成的对象:
- 一个默认构造的 path(),然后是
- N 次应用 operator/=(path("..")),然后是
- 对
[
a,
end())
半开范围内每个元素应用一次 operator/=。
3) 如果 lexically_relative(base) 的值为非空路径,则返回它。否则返回 *this。
内容 |
[编辑] 参数
(无)
[编辑] 返回值
1) 路径的规范形式。
2) 路径的相对形式。
3) 路径的近似形式。
[编辑] 异常
可能抛出实现定义的异常。
[编辑] 备注
这些转换纯粹是词法上的。它们不检查路径是否存在,不跟踪符号链接,也不访问文件系统。有关 lexically_relative
和 lexically_proximate
的符号链接跟踪对应物,请参阅 relative 和 proximate。
在 Windows 上,返回的 path
包含反斜杠(首选分隔符)。
在 POSIX 上,相对路径中的任何文件名都不能作为 根名称。
[编辑] 示例
运行此代码
#include <cassert> #include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { assert(fs::path("a/./b/..").lexically_normal() == "a/"); assert(fs::path("a/.///b/../").lexically_normal() == "a/"); assert(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d"); assert(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c"); assert(fs::path("a/b/c").lexically_relative("a") == "b/c"); assert(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../.."); assert(fs::path("a/b/c").lexically_relative("a/b/c") == "."); assert(fs::path("a/b").lexically_relative("c/d") == "../../a/b"); assert(fs::path("a/b").lexically_relative("/a/b") == ""); assert(fs::path("a/b").lexically_proximate("/a/b") == "a/b"); }
[编辑] 缺陷报告
以下行为变更缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3070 | C++17 | 可以作为根名的文件名可能会导致意外结果 | 被视为错误情况 |
LWG 3096 | C++17 | 对尾随的“/”和“/.”处理不正确 | 已更正 |
[编辑] 参见
(C++17) |
构成一个相对路径 (函数) |