Spec-Zone.ru › C++

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)
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++.

DR Применимо к Поведение, как опубликовано Корректное поведение
LWG 3070 C++17 имя файла, которое также может быть именем корня, может привести к неожиданному результату обрабатывается как случай ошибки
LWG 3096 C++17 конечный "/" и "/." обрабатываются неправильно исправлено

См. также

relative proximate
(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

Spec-Zone.ru

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