std::filesystem::equivalent
Объявлено в заголовочном файле <filesystem> | ||
|---|---|---|
bool equivalent( const std::filesystem::path& p1,
const std::filesystem::path& p2 );
| (1) | (начиная с C++17) |
bool equivalent( const std::filesystem::path& p1,
const std::filesystem::path& p2,
std::error_code& ec ) noexcept;
| (2) | (начиная с C++17) |
Проверяет, разрешаются ли пути p1 и p2 в один и тот же объект файловой системы.
Если p1 или p2 не существует, сообщается об ошибке.
Перегрузка без выброса исключений возвращает false при возникновении ошибок.
Параметры
| p1, p2 | - | пути, эквивалентность которых проверяется |
| ec | - | выходной параметр для сообщения об ошибке в перегрузке без выброса исключений |
Возвращаемое значение
true, если p1 и p2 указывают на один и тот же файл или каталог и их состояния файлов совпадают. В противном случае — false.
Исключения
Любая перегрузка, не помеченная как noexcept, может выбросить std::bad_alloc при сбое выделения памяти.
std::filesystem::filesystem_error при ошибках нижележащего API ОС; исключение создаётся с p1 в качестве первого аргумента-пути, p2 в качестве второго аргумента-пути и кодом ошибки ОС в качестве аргумента кода ошибки.std::error_code&, а при отсутствии ошибок выполняет ec.clear().Примечания
Считается, что два пути разрешаются в один и тот же объект файловой системы, если два соответствующих объекта, на которые разрешаются пути, находятся на одном устройстве в одном и том же месте. Для POSIX это означает, что члены st_dev и st_ino их POSIX-структур stat, полученных так, как если бы был вызван POSIX-функция stat(), равны.
В частности, все жёсткие ссылки на один и тот же файл или каталог эквивалентны, как и символическая ссылка и её цель в одной файловой системе.
Пример
#include <cstdint>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
// hard link equivalency
fs::path p1 = ".";
fs::path p2 = fs::current_path();
if (fs::equivalent(p1, p2))
std::cout << p1 << " is equivalent to " << p2 << '\n';
// symlink equivalency
for (const fs::path lib : {"/lib/libc.so.6", "/lib/x86_64-linux-gnu/libc.so.6"})
{
try
{
p2 = lib.parent_path() / fs::read_symlink(lib);
}
catch (std::filesystem::filesystem_error const& ex)
{
std::cout << ex.what() << '\n';
continue;
}
if (fs::equivalent(lib, p2))
std::cout << lib << " is equivalent to " << p2 << '\n';
}
}
Возможный вывод:
"." is equivalent to "/var/tmp/test" filesystem error: read_symlink: No such file or directory [/lib/libc.so.6] "/lib/x86_64-linux-gnu/libc.so.6" is equivalent to "/lib/x86_64-linux-gnu/libc-2.23.so"
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2937 | C++17 | условие ошибки указано неверно | исправлено |
См. также
| лексикографически сравнивает лексические представления двух путей (открытая функция-член std::filesystem::path) |
|
|
(C++17)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++20) | лексикографически сравнивают два пути (функция) |
|
(C++17)(C++17) | определяет атрибуты файла определяет атрибуты файла, проверяя цель символической ссылки (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/equivalent