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,
|
(2) | (начиная с C++17) |
Проверяет, ссылаются ли пути p1 и p2 на одну и ту же сущность файловой системы.
Если либо p1 или p2 не существует, выводится сообщение об ошибке.
Невозбуждающая перегрузка возвращает false при ошибках.
Содержание |
Параметры
| p1, p2 | - | пути для проверки на эквивалентность |
| ec | - | выходной параметр для сообщения об ошибках в непорождающей перегрузке |
Возвращаемое значение
true если p1 и p2 ссылаются на один и тот же файл или директорию и их статус файла одинаков. false в противном случае.
Исключения
Любая перегрузка, не помеченная
noexcept
, может выбрасывать
std::bad_alloc
при неудачном выделении памяти.
Примечания
Два пути считаются указывающими на одну и ту же сущность файловой системы, если кандидатные сущности, на которые разрешаются пути, расположены на одном устройстве в одном и том же месте. Для 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++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2937 | C++17 | условие ошибки указано некорректно | исправлено |
Смотрите также
|
лексикографически сравнивает лексические представления двух путей
(публичная функция-член
std::filesystem::path
)
|
|
|
(C++17)
(C++17)
(until C++20)
(C++17)
(until C++20)
(C++17)
(until C++20)
(C++17)
(until C++20)
(C++17)
(until C++20)
(C++20)
|
лексикографически сравнивает два пути
(функция) |
|
(C++17)
(C++17)
|
определяет атрибуты файла
определяет атрибуты файла, проверяя цель символьной ссылки (функция) |