Namespaces
Variants

std::filesystem:: equivalent

From ru.cppreference.net
Определено в заголовочном файле <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) Устанавливает параметр std:: error_code & в код ошибки API ОС при сбое вызова 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 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)
определяет атрибуты файла
определяет атрибуты файла, проверяя цель символьной ссылки
(функция)