Spec-Zone.ru › C++

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)
1) Возвращает *this, преобразованный в нормальную форму в общем формате.
2) Возвращает *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()).
3) Если значение lexically_relative(base) не является пустым путём, возвращает его. В противном случае возвращает *this.

Параметры

(нет)

Возвращаемое значение

1) Нормальная форма пути.
2) Относительная форма пути.
3) Приближённая форма пути.

Исключения

Может выбрасывать исключения, определяемые реализацией.

Примечания

Эти преобразования являются чисто лексическими. Они не проверяют существование путей, не следуют по символическим ссылкам и вообще не обращаются к файловой системе. Варианты 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 завершающие «/» и «/.» обрабатываются некорректно исправлено

См. также

relativeproximate
(C++17)
составляет относительный путь
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/path/lexically_normal

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API