Spec-Zone.ru › C++

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 при сбое выделения памяти.

1) Выбрасывает std::filesystem::filesystem_error при ошибках нижележащего API ОС; исключение создаётся с p1 в качестве первого аргумента-пути, p2 в качестве второго аргумента-пути и кодом ошибки ОС в качестве аргумента кода ошибки.
2) При сбое вызова API ОС записывает код ошибки API ОС в параметр 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 условие ошибки указано неверно исправлено

См. также

compare
лексикографически сравнивает лексические представления двух путей
(открытая функция-член std::filesystem::path)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++17)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++20)
лексикографически сравнивают два пути
(функция)
statussymlink_status
(C++17)(C++17)
определяет атрибуты файла
определяет атрибуты файла, проверяя цель символической ссылки
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/equivalent

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API