命名空间
变体
操作

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 起)
1) 返回 *this 转换为 规范形式,以其通用格式。
2) 返回 *this 相对于 base 的相对路径。
  • 首先,如果 root_name() != base.root_name()trueis_absolute() != base.is_absolute()true(!has_root_directory() && base.has_root_directory())truerelative_path()base.relative_path() 中的任何文件名可以解释为 根名称,则返回一个默认构造的路径。
  • 否则,首先确定 *thisbase 的第一个不匹配元素,就像通过 auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()) 一样,然后
  • 如果 a == end()b == base.end(),则返回 path(".")
  • 否则,定义 N[b, base.end()) 中的非空文件名元素的数量,这些元素既不是 也不 点-点,减去 点-点 文件名元素的数量,如果 N < 0,则返回一个默认构造的路径,
  • 否则,如果 N = 0a == end() || a->empty(),则返回 path(".")
  • 否则返回一个由以下内容组成的对象:
  • 一个默认构造的 path(),然后是
  • N 次应用 operator/=(path("..")),然后是
  • [aend()) 半开范围内每个元素应用一次 operator/=
3) 如果 lexically_relative(base) 的值为非空路径,则返回它。否则返回 *this

内容

[编辑] 参数

(无)

[编辑] 返回值

1) 路径的规范形式。
2) 路径的相对形式。
3) 路径的近似形式。

[编辑] 异常

可能抛出实现定义的异常。

[编辑] 备注

这些转换纯粹是词法上的。它们不检查路径是否存在,不跟踪符号链接,也不访问文件系统。有关 lexically_relativelexically_proximate 的符号链接跟踪对应物,请参阅 relativeproximate

在 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 对尾随的“/”和“/.”处理不正确 已更正

[编辑] 参见

构成一个相对路径
(函数) [编辑]