std::filesystem::path::lexically_normal,std::filesystem::path::lexically_relative, (3) Linux Manual Page
std::filesystem::path::lexically_normal,std::filesystem::path::lexically_relative, – std::filesystem::path::lexically_normal,std::filesystem::path::lexically_relative,
Synopsis
path lexically_normal()
path lexically_relative(const path&
path lexically_proximate(const path&
1)
2)
*First, if root_name () != base.root_name() || is_absolute() != base.is_absolute()
|| (!has_root_directory() && base.has_root_directory()),
returns a
default -
constructed path.
*Otherwise,
first determines the first mismatched element of *this and base as if
by auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()),
then
*if a
== end() and
b == base.end(),
returns path(".");
* otherwise, define N as the number of nonempty filename elements that are neither
dot nor dot-dot in [b, base.end()), minus the number of dot-dot filename
elements, If N < 0, returns a default-constructed path.
* otherwise, if N = 0 and a == end() || a->empty(), returns path(".").
* otherwise returns an object composed from
* a default-constructed path() followed by
* N applications of operator/=(path("..")), followed by
* one application of operator/= for each element in the half-open range [a, end())
3)
Otherwise return
Parameters
(none)
Return value
1)
2)
3)
Exceptions
(none)
Notes
These conversions are purely lexical. They do not check that the paths exist, do not
follow symlinks, and do not access the filesystem at all. For symlink-following
counterparts of lexically_relative and lexically_proximate, see relative and
proximate.
On Windows, the returned path has backslashes
Example
// Run this code
#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(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");
}
The following behavior-changing defect reports were applied retroactively to
previously published C++
DR
LWG 3096 C++17
See also
relative
proximate
(C++17)
