Namespaces
Variants

std::filesystem:: equivalent

From cppreference.net
Definido en el encabezado <filesystem>
bool equivalent ( const std:: filesystem :: path & p1,
const std:: filesystem :: path & p2 ) ;
(1) (desde C++17)
bool equivalent ( const std:: filesystem :: path & p1,

const std:: filesystem :: path & p2,

std:: error_code & ec ) noexcept ;
(2) (desde C++17)

Comprueba si las rutas p1 y p2 se resuelven en la misma entidad del sistema de archivos.

Si p1 o p2 no existe, se reporta un error.

La sobrecarga que no lanza excepciones retorna false en caso de errores.

Contenidos

Parámetros

p1, p2 - rutas a verificar para equivalencia
ec - parámetro de salida para reporte de errores en la sobrecarga no lanzadora

Valor de retorno

true si p1 y p2 se refieren al mismo archivo o directorio y su estado de archivo es el mismo. false en caso contrario.

Excepciones

Cualquier sobrecarga no marcada como noexcept puede lanzar std::bad_alloc si la asignación de memoria falla.

1) Lanza std::filesystem::filesystem_error en errores de API del sistema operativo subyacente, construido con p1 como primer argumento de ruta, p2 como segundo argumento de ruta, y el código de error del sistema operativo como argumento de código de error.
2) Establece un parámetro std:: error_code & al código de error de la API del sistema operativo si una llamada a la API del SO falla, y ejecuta ec. clear ( ) si no ocurren errores.

Notas

Dos rutas se consideran que resuelven a la misma entidad del sistema de archivos si las dos entidades candidatas a las que resuelven las rutas están ubicadas en el mismo dispositivo en la misma ubicación. Para POSIX, esto significa que los miembros st_dev y st_ino de su stat structure de POSIX, obtenidos como si fuera mediante stat() de POSIX, son iguales.

En particular, todos los enlaces físicos para el mismo archivo o directorio son equivalentes, y un enlace simbólico y su destino en el mismo sistema de archivos son equivalentes.

Ejemplo

#include <cstdint>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    // equivalencia de enlace físico
    fs::path p1 = ".";
    fs::path p2 = fs::current_path();
    if (fs::equivalent(p1, p2))
        std::cout << p1 << " es equivalente a " << p2 << '\n';
    // equivalencia de enlace simbólico
    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 << " es equivalente a " << p2 << '\n';
    }
}

Salida posible:

"." 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"

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2937 C++17 condición de error especificada incorrectamente corregido

Véase también

compara las representaciones léxicas de dos rutas lexicográficamente
(función miembro pública de 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)
compara lexicográficamente dos rutas
(función)
(C++17) (C++17)
determina los atributos del archivo
determina los atributos del archivo, verificando el destino del enlace simbólico
(función)