std::filesystem::canonical, std::filesystem::weakly_canonical
| Definido en el archivo de encabezado <filesystem>
|
||
path canonical( const std::filesystem::path& p ); |
(1) | (desde C++17) |
path canonical( const std::filesystem::path& p, std::error_code& ec ); |
(2) | (desde C++17) |
path weakly_canonical(const std::filesystem::path& p); |
(3) | (desde C++17) |
path weakly_canonical(const std::filesystem::path& p, std::error_code& ec); |
(4) | (desde C++17) |
p a la ruta canónica absoluta, es decir, una ruta de acceso absoluta que no tiene elementos punto o punto-punto, o enlaces simbólicos en su formato representación de genérico. Si p no es una ruta absoluta, la función se comporta como si primero se hubiera hecho absolouta por std::filesystem::absolute(p). La ruta de acceso p debe existir.operator/= del resultado de llamar a canonical() con una ruta como argumento compuesta de los elementos iniciales de p que existan (como se determina por status(p) o status(p, ec)), si los hay, seguida por los elementos de p que no existan. La ruta resultante está en la forma normal.Parámetros
| p | - | Una ruta de acceso que puede ser absoluta o relativa; para canonical de ser una ruta que exista.
|
| ec | - | El código de error en el que almacenar el estado de error. |
Valor de retorno
std::filesystem::absolute(p).canonical(x)/y, donde x es una ruta compuesta de la secuencia inicial más larga en p que existen, e y es una ruta compuesta de los elementos restantes de p que no existen.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 p como el primer 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.
Notas
La función canonical() sigue el modelo de la función realpath de POSIX.
La función weakly_canonical() se introdujo para simplificar la semántica operacional de relative().
Ejemplo
#include <iostream>
#include <filesystem>
int main()
{
/* preparar los directorios aislados:
a
└── b
├── c1
│ └── d <== ruta de acceso actual
└── c2
└── e
*/
auto old = std::filesystem::current_path();
auto tmp = std::filesystem::temp_directory_path();
std::filesystem::current_path(tmp);
auto d1 = tmp / "a/b/c1/d";
auto d2 = tmp / "a/b/c2/e";
std::filesystem::create_directories(d1);
std::filesystem::create_directories(d2);
std::filesystem::current_path(d1);
auto p1 = std::filesystem::path("../../c2/./e");
auto p2 = std::filesystem::path("../no-hay-tal-archivo");
std::cout << "La ruta de acceso actual es "
<< std::filesystem::current_path() << '\n'
<< "La ruta de acceso canónica para " << p1 << " es "
<< std::filesystem::canonical(p1) << '\n'
<< "La ruta de acceso débilmente canónica para " << p2 << " es "
<< std::filesystem::weakly_canonical(p2) << '\n';
try
{
std::filesystem::canonical(p2);
// NO SE ALCANZÓ
}
catch(const std::exception& ex)
{
std::cout << "La ruta de acceso canónica para " << p2 << " lanzó una excepción:\n"
<< ex.what() << '\n';
}
// limpieza
std::filesystem::current_path(old);
const auto count = std::filesystem::remove_all(tmp / "a");
std::cout << "Se borraron " << count << " archivos o directorios.\n";
}
Posible salida:
La ruta de acceso actual es "/tmp/a/b/c1/d"
La ruta de acceso canónica para "../../c2/./e" es "/tmp/a/b/c2/e"
La ruta de acceso débilmente canónica para "../no-hay-tal-archivo" es "/tmp/a/b/c1/no-hay-tal-archivo"
La ruta de acceso canónica para "../no-hay-tal-archivo" lanzó una excepción:
filesystem error: in canonical: No hay tal archivo o directorio [../no-hay-tal-archivo] [/tmp/a/b/c1/d]
Se borraron 6 archivos o directorios.
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 2956 | C++17 | canonical tiene un parámetro base espurio.
|
Se eliminó. |
Véase también
(C++17) |
Representa una ruta de acceso. (clase) |
(C++17) |
Compone una ruta de acceso absoluta. (función) |
(C++17) |
Compone una ruta de acceso relativa. (función) |