Namespaces
Variants

std::filesystem::path:: lexically_normal, std::filesystem::path:: lexically_relative, std::filesystem::path:: lexically_proximate

From cppreference.net
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 ни одно имя файла в относительном пути не может быть использовано в качестве root-name .

Пример

#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 Applied to Behavior as published Correct behavior
LWG 3070 C++17 имя файла, которое также может быть корневым именем, может привести к неожиданному результату обрабатывается как ошибочный случай
LWG 3096 C++17 завершающие "/" и "/." обрабатываются некорректно исправлено

Смотрите также

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