std::filesystem::path::lexically_normal, std::filesystem::path::lexically_relative, std::filesystem::path::lexically_proximate
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) |
*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("..")), за которыми следует - одно применение
operator/=для каждого элемента полуоткрытого диапазона[a,end()).
lexically_relative(base) не является пустым путём, возвращает его. В противном случае возвращает *this.Параметры
(нет)
Возвращаемое значение
Исключения
Может выбрасывать исключения, определяемые реализацией.
Примечания
Эти преобразования являются чисто лексическими. Они не проверяют существование путей, не следуют по символическим ссылкам и вообще не обращаются к файловой системе. Варианты 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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 3070 | C++17 | имя файла, которое также может быть именем корня, может привести к неожиданному результату | обрабатывается как ошибочный случай |
| LWG 3096 | C++17 | завершающие «/» и «/.» обрабатываются некорректно | исправлено |
См. также
|
(C++17) | составляет относительный путь (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/path/lexically_normal