std::filesystem::equivalent
Defined in header <filesystem> | ||
|---|---|---|
bool equivalent( const std::filesystem::path& p1,
const std::filesystem::path& p2 );
| (1) | (since C++17) |
bool equivalent( const std::filesystem::path& p1,
const std::filesystem::path& p2,
std::error_code& ec ) noexcept;
| (2) | (since C++17) |
Проверяет, ссылаются ли пути p1 и p2 на один и тот же объект в файловой системе.
Если один из путей p1 или p2 не существует, генерируется ошибка.
В варианте перегрузки без исключений в случае ошибки возвращается %%%CODE_BLOCK_7%%.
Параметры
| p1, p2 | - | пути для проверки эквивалентности |
| ec | - | параметр-результат для сообщения об ошибке в перегрузке без исключений |
Значение результата
true если пути p1 и p2 ссылаются на один и тот же файл или директорию и их состояние одинаково. false в противном случае.
Исключения
Любая перегрузка, не помеченная как noexcept, может выбросить std::bad_alloc в случае неудачного выделения памяти.
std::filesystem::filesystem_error при ошибках в вызовах API операционной системы, сконструированную с p1 в качестве первого аргумента пути, p2 в качестве второго аргумента пути и кодом ошибки ОС в качестве аргумента ошибки.std::error_code& в код ошибки API операционной системы в случае неудачного вызова, и выполняет 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++.
| DR | Применено к | Поведение при публикации | Правильное поведение |
|---|---|---|---|
| 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/w/cpp/filesystem/equivalent