std::filesystem:: canonical, std::filesystem:: weakly_canonical
From cppreference.net
<
cpp
|
filesystem
|
Определено в заголовочном файле
<filesystem>
|
||
|
path canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(1) | (начиная с C++17) |
|
path canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(2) | (начиная с C++17) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(3) | (начиная с C++17) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(4) | (начиная с C++17) |
1,2)
Преобразует путь
p
в канонический абсолютный путь, т.е. абсолютный путь, не содержащий элементов "." (текущая директория), ".." (родительская директория) или символических ссылок в его общем формате представления. Если
p
не является абсолютным путем, функция ведет себя так, как если бы он сначала был сделан абсолютным с помощью
std::
filesystem
::
absolute
(
p
)
. Путь
p
должен существовать.
3,4)
Возвращает путь, составленный с помощью
operator
/
=
из результата вызова
canonical()
с аргументом пути, состоящим из ведущих элементов
p
которые существуют (определяется с помощью
status
(
p
)
или
status
(
p, ec
)
), если таковые имеются, за которыми следуют элементы
p
которые не существуют. Результирующий путь находится в
нормальной форме
.
Содержание |
Параметры
| p | - |
путь, который может быть абсолютным или относительным; для
canonical
это должен быть существующий путь
|
| ec | - | код ошибки для сохранения статуса ошибки |
Возвращаемое значение
1,2)
Абсолютный путь, который разрешается в тот же файл, что и
std::
filesystem
::
absolute
(
p
)
.
3,4)
Нормальный путь вида
canonical
(
x
)
/
y
, где
x
— это путь, состоящий из самой длинной начальной последовательности элементов в
p
, которые существуют, а
y
— это путь, состоящий из оставшихся конечных несуществующих элементов
p
.
Исключения
Любая перегрузка, не помеченная
noexcept
, может выбрасывать
std::bad_alloc
при неудачном выделении памяти.
1,3)
Выбрасывает
std::filesystem::filesystem_error
при ошибках базового API ОС, созданный с
p
в качестве первого аргумента пути и кодом ошибки ОС в качестве аргумента кода ошибки.
2,4)
Устанавливает параметр
std::
error_code
&
в код ошибки API операционной системы при сбое вызова OS API, и выполняет
ec.
clear
(
)
если ошибок не происходит.
Примечания
Функция
canonical()
создана по образцу POSIX-функции
realpath
.
Функция
weakly_canonical()
была введена для упрощения операционной семантики
relative()
.
Пример
Запустить этот код
#include <filesystem> #include <iostream> int main() { /* настройка песочницы директорий: a └── b ├── c1 │ └── d <== текущий путь └── c2 └── e */ auto old = std::filesystem::current_path(); auto tmp = std::filesystem::temp_directory_path(); std::filesystem::current_path(tmp); auto d1 = tmp / "a/b/c1/d"; auto d2 = tmp / "a/b/c2/e"; std::filesystem::create_directories(d1); std::filesystem::create_directories(d2); std::filesystem::current_path(d1); auto p1 = std::filesystem::path("../../c2/./e"); auto p2 = std::filesystem::path("../no-such-file"); std::cout << "Текущий путь: " << std::filesystem::current_path() << '\n' << "Канонический путь для " << p1 << ": " << std::filesystem::canonical(p1) << '\n' << "Слабо канонический путь для " << p2 << ": " << std::filesystem::weakly_canonical(p2) << '\n'; try { [[maybe_unused]] auto x_x = std::filesystem::canonical(p2); // НЕ ДОСТИГНУТО } catch (const std::exception& ex) { std::cout << "Канонический путь для " << p2 << " вызвал исключение:\n" << ex.what() << '\n'; } // очистка std::filesystem::current_path(old); const auto count = std::filesystem::remove_all(tmp / "a"); std::cout << "Удалено " << count << " файлов или директорий.\n"; }
Возможный вывод:
Текущий путь: "/tmp/a/b/c1/d" Канонический путь для "../../c2/./e": "/tmp/a/b/c2/e" Слабо канонический путь для "../no-such-file": "/tmp/a/b/c1/no-such-file" Канонический путь для "../no-such-file" вызвал исключение: filesystem error: in canonical: No such file or directory [../no-such-file] [/tmp/a/b/c1/d] Удалено 6 файлов или директорий.
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2956 | C++17 |
canonical
имеет ошибочный параметр
base
|
удалён |
Смотрите также
|
(C++17)
|
представляет путь
(класс) |
|
(C++17)
|
формирует абсолютный путь
(функция) |
|
(C++17)
|
формирует относительный путь
(функция) |