std::filesystem::equivalent
Definido en el archivo de encabezado <filesystem>
|
||
bool equivalent( const std::filesystem::path& p1, const std::filesystem::path& p2 ); |
(desde C++17) | |
Verifica si las rutas de acceso p1
y p2
se resuelven a la misma entidad del sistema de archivos.
Si p1
o p2
no existen, se informa que ocurrió un error.
La sobrecarga que no lanza excepciones devuelve false
si ocurren errores.
Contenido |
[editar] Parámetros
p1, p2 | - | Las rutas de acceso a verificar que sean equivalentes. |
ec | - | El parámetro de salida para informe de errores en la sobrecarga que no lanza excepciones. |
[editar] Valor de retorno
true si p1
y p2
se refieren al mismo archivo o directorio y su estado de archivo es el mismo; false de lo contrario.
[editar] Excepciones
La sobrecarga que no toma un parámetro std::error_code& lanza filesystem::filesystem_error en los errores de la API del sistema operativo subyacente, construido con p1
como el primer argumento de la ruta de acceso, p2
como el segundo argumento de la ruta de acceso, y el código de error del sistema operativo como el argumento del código de error. La sobrecarga que toma un parámetro std::error_code& lo establece en el código de error de la API del sistema operativo si una llamada a la API del sistema operativo falla, y ejecuta ec.clear() si no ocurren errores. Cualquier sobrecarga que no está marcada con noexcept puede lanzar std::bad_alloc si la asignación de memoria falla.
[editar] Notas
Se considera que dos rutas de acceso se resuelven a la misma entidad del sistema de archivos si las dos entidades candidatas a las que se resuelven las rutas, se ubican en el mismo dispositivo en la misma ubicación. Para POSIX, esto significa que los miembros st_dev
y st_ino
de su estructura stat
de POSIX, obtenida como si fuera por la función 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 objetivo en el mismo sistema de archivos son equivalentes.
[editar] Ejemplo
#include <iostream> #include <cstdint> #include <filesystem> 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'; } }
Posible salida:
"." es equivalente a "/var/tmp/prueba" error del sistema de archivos: read_symlink: No existe tal archivo o directorio [/lib/libc.so.6] "/lib/x86_64-linux-gnu/libc.so.6" es equivalente a "/lib/x86_64-linux-gnu/libc-2.23.so"
[editar] Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 2937 | C++17 | La condición de error se especificaba incorrectamente. | Se corrigió. |
[editar] Véase también
Compara las representaciones lexicográficas de dos rutas de acceso lexicográficamente. (función miembro pública de std::filesystem::path )
| |
(hasta C++20)(hasta C++20)(hasta C++20)(hasta C++20)(hasta C++20)(C++20) |
Compara lexicográficamente dos rutas de acceso. (función) |
(C++17)(C++17) |
Determina los atributos de archivo. Determina los atributos de archivo, verificando el objetivo del enlace simbólico. (función) |