Функция 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,
которая проверяет эквивалентность двух путей