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) |
-
- Сначала, если 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
и
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 | завершающие "/" и "/." обрабатываются некорректно | исправлено |
Смотрите также
|
(C++17)
|
составляет относительный путь
(функция) |