Spec-Zone.ru › C++

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

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

См. также

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/w/cpp/filesystem/equivalent

Spec-Zone.ru

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