РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
505 of 815 menu

Функция canonical

Функция canonical из пространства имен std::filesystem преобразует заданный путь к канонической абсолютной форме. Канонический путь не содержит символических ссылок, элементов "." и "..", а также всегда является абсолютным. В первом параметре мы передаем исходный путь, который нужно канонизировать. Второй параметр необязательный - он задает базовый путь, относительно которого будет разрешаться относительный путь, если исходный путь не является абсолютным. Если канонизация невозможна (например, путь не существует), функция выбрасывает исключение filesystem_error.

Синтаксис

path canonical(const path& p); path canonical(const path& p, const path& base); path canonical(const path& p, error_code& ec); path canonical(const path& p, const path& base, error_code& ec);

Пример

Давайте получим канонический путь для текущего каталога, добавив к нему элементы "." и "..", которые должны быть удалены при канонизации:

#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { fs::path p = fs::current_path() / "." / ".." / "."; fs::path res = fs::canonical(p); cout << res << endl; return 0; }

Результат выполнения кода:

"/home/user"

Пример

Давайте канонизируем относительный путь, передав во второй параметр базовый каталог:

#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { fs::path base = fs::current_path(); fs::path p = "abcde/../abcde"; fs::path res = fs::canonical(p, base); cout << res << endl; return 0; }

Результат выполнения кода:

"/home/user/abcde"

Пример

Давайте обработаем ошибку канонизации без исключения, используя перегрузку с error_code:

#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { fs::path p = "/nonexistent/path/abcde"; error_code ec; fs::path res = fs::canonical(p, ec); if (ec) { cout << "Error: " << ec.message() << endl; } else { cout << res << endl; } return 0; }

Результат выполнения кода:

"Error: No such file or directory"

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

  • функция absolute,
    которая делает путь абсолютным без разворота ссылок
  • функция weakly_canonical,
    которая канонизирует только существующую часть пути
  • метод lexically_normal,
    который нормализует путь лексически
  • функция equivalent,
    которая проверяет эквивалентность двух путей
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить