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) |
*this converted to normal form (no redundant dot or dot-dot elements, and if the last element is a non-root directory separator, dot is added)*this made relative to base. Effectively, first, determines the first mismatched element of *this and base as if by auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()), then a == begin() and b == base.begin(), returns path() (empty path). a == end() and b == base.end(), returns path("."); path() followed by one application of operator/=(path("..")) for each each element in the half-open range [b, base.end()), and then by one application of operator/= for each element in the half-open range [a, end()).lexically_relative(base) is not an empty path, return it. Otherwise return *this.(none).
(none).
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 (the preferred separators),
#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") == "");
}|
(C++17) | composes a relative path (function) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/filesystem/path/lexically_normal