std::filesystem::path::lexically_normal, std::filesystem::path::lexically_relative, std::filesystem::path::lexically_proximate
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, относящуюся к 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++.
| DR | Применимо к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| 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/w/cpp/filesystem/path/lexically_normal