std::filesystem::path::lexically_normal
std::文件系统::path::[医]普通的,std::文件系统::path::[医]相对而言,std::文件系统::path::[医]近端
path lexically_normal() const; | (1) | (since C++17) |
---|---|---|
path lexically_relative(const path& base) const; | (2) | (since C++17) |
path lexically_proximate(const path& base) const; | (3) | (since C++17) |
1%29*this
转换成范式%28无冗余网点
或点点
元素,如果最后一个元素是非根目录分隔符,网点
加%29
2%29*this
相对于base
的第一个不匹配元素。*this
和base
好像auto [a, b] = mismatch(begin(), end(), base.begin(), base.end())
,然后
- 如果
a == begin()
和b == base.begin()
、回报path()
%28空路径%29。
- 否则,如果
a == end()
和b == base.end()
、回报path(".")
;
- 否则,返回由默认构造的对象组成的对象。
path()
然后是一份申请operator/=(path(".."))
对于半开放范围内的每个元素[b, base.end())
,然后通过一个应用程序operator/=
对于半开放范围内的每个元素[a, end())
...
3%29如果lexically_relative(base)
不是一条空的路,把它还给我。否则返回*this
...
参数
%280%29
返回值
1%29路径的正常形式
2%29路径的相对形式
3%29这条路的最接近的形式
例外
%280%29
注记
这些转换都是纯粹的词汇。它们不检查路径是否存在,不遵循符号链接,也根本不访问文件系统。的符号跟随对应方lexically_relative
和lexically_proximate
,见relative
和proximate
...
在Windows上,返回的路径有反斜杠%28首选分隔符%29,
例
二次
#include <iostream>
#include <filesystem>
#include <cassert>
namespace fs = std::filesystem;
int main()
{
assert(fs::path("foo/./bar/..").lexically_normal() == "foo"
assert(fs::path("foo/.///bar/../").lexically_normal() == "foo/."
assert(path("/a/d").lexically_relative("/a/b/c") == "../../d"
assert(path("/a/b/c").lexically_relative("/a/d") == "../b/c"
assert(path("a/b/c").lexically_relative("a") == "b/c"
assert(path("a/b/c").lexically_relative("a/b/c/x/y") == "../.."
assert(path("a/b/c").lexically_relative("a/b/c") == "."
assert(path("a/b").lexically_relative("c/d") == ""
}
二次
另见
relativeproximate (C++17) | composes a relative path (function) |
---|
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。