Namespaces
Variants

std::experimental::filesystem:: equivalent

From cppreference.net
Определено в заголовочном файле <experimental/filesystem>
bool equivalent ( const path & p1, const path & p2 ) ;
bool equivalent ( const path & p1, const path & p2, error_code & ec ) ;
(1) (filesystem TS)

Проверяет, ссылаются ли пути p1 и p2 на один и тот же файл или каталог и имеют одинаковый статус файла, определяемый с помощью status (символические ссылки отслеживаются).

Если p1 или p2 не существуют или если их тип файла не является обычным файлом, директорией или символьной ссылкой (как определено в is_other ), сообщается об ошибке.

Нетранслирующая перегрузка возвращает false при ошибках.

Содержание

Параметры

p1, p2 - пути для проверки на эквивалентность
ec - выходной параметр для сообщения об ошибках в непорождающей перегрузке

Возвращаемое значение

true если p1 и p2 ссылаются на один и тот же файл или директорию и их статус файла одинаков. false в противном случае.

Исключения

The overload that does not take an error_code & parameter throws filesystem_error on underlying OS API errors, constructed with p1 as the first argument, p2 as the second argument, and the OS error code as the error code argument. std:: bad_alloc may be thrown if memory allocation fails. The overload taking an error_code & parameter sets it to the OS API error code if an OS API call fails, and executes ec. clear ( ) if no errors occur. This overload has
noexcept спецификация:
noexcept

Примечания

Два пути считаются указывающими на одну и ту же сущность файловой системы, если st_dev и st_ino их POSIX структуры stat , полученной как если бы с помощью POSIX stat , равны (то есть файлы находятся на одном устройстве в одном месте).

В частности, все жесткие ссылки для одного и того же файла или каталога эквивалентны, а символьная ссылка и ее целевой объект в одной файловой системе эквивалентны.

Пример

#include <cstdint>
#include <experimental/filesystem>
#include <iostream>
namespace fs = std::experimental::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
    fs::path p3 = "/lib/libc.so.6";
    fs::path p4 = p3.parent_path() / fs::read_symlink(p3);
    if (fs::equivalent(p3, p4))
        std::cout << p3 << " is equivalent to " << p4 << '\n';
}

Возможный вывод:

"." is equivalent to "/var/tmp/test"
"/lib/libc.so.6" is equivalent to "/lib/libc-2.12.so"

Смотрите также

определяет атрибуты файла
определяет атрибуты файла, проверяя цель символьной ссылки
(функция)