Namespaces
Variants

std::filesystem:: canonical, std::filesystem:: weakly_canonical

From cppreference.net
Определено в заголовочном файле <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)
формирует абсолютный путь
(функция)
формирует относительный путь
(функция)