Espacios de nombres
Variantes
Acciones

std::filesystem::path::lexically_normal, std::filesystem::path::lexically_relative, std::filesystem::path::lexically_proximate

De cppreference.com
< cpp‎ | filesystem‎ | path
 
 
 
 
path lexically_normal() const;
(1)(desde C++17)
path lexically_relative(const path& base) const;
(2)(desde C++17)
path lexically_proximate(const path& base) const;
(3)(desde C++17)
1) Devuelve *this convertido a la forma normal en su formato genérico.
2) Devuelve *this hecho relativo a base.
  • Primero, si root_name() != base.root_name() es true o is_absolute() != base.is_absolute() es true o (!has_root_directory() && base.has_root_directory()) es true o cualquier nombre de archivo en relative_path() o base.relative_path() puede interpretarse como un nombre-raíz, devuelve una ruta de acceso construida por defecto.
  • De lo contrario, primero determina el primer elemento no coincidente de *this y base como si fuera por auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()), entonces
  • si a == end() y b == base.end(), devuelve path(".");
  • de lo contrario, define N como el número de elementos de nombre de archivo no vacíos que no son ni punto ni punto-punto en [b, base.end()), menos el número de elementos de nombre de archivo punto-punto, si N < 0, devuelve una ruta de acceso construida por defecto.
  • de lo contrario, si N = 0 y a == end() || a->empty(), devuelve path(".");
  • de lo contrario devuelve un objeto compuesto de
  • una ruta de acceso path() construida por defecto, seguida de
  • N aplicaciones de operator/=(path("..")), seguida de
  • una aplicación de operator/= para cada elemento en el rango semiabierto [a, end()).
3) Si el valor de lexically_relative(base) no es una ruta de acceso vacía, devolverla. De lo contrario devolver *this.

Contenido

[editar] Parámetros

(Ninguno)

[editar] Valor de retorno

1) La forma normal de la ruta de acceso.
2) La forma relativa de la ruta de acceso.
3) La forma aproximada de la ruta de acceso.

[editar] Excepciones

Puede lanzar excepciones definidas por la implementación.

[editar] Notas

Estas conversiones son puramente léxicas. No verifican que las rutas existan, no siguen los enlaces simbólicos y no acceden al sistema de archivos en absoluto. Para contrapartes de seguimiento simbólico de lexically_relative y lexically_proximate, véase relative y proximate.

En Windows, la ruta de acceso devuelta tiene barras invertidas (la barra invertida es el separador de directorio preferido).

En POSIX, ningún nombre de archivo en una ruta de acceso relativa es aceptable como un nombre-raíz.

[editar] Ejemplo

#include <iostream>
#include <filesystem>
#include <cassert>
namespace fs = std::filesystem;
 
int main()
{
    assert(fs::path("a/./b/..").lexically_normal() == "a/");
    assert(fs::path("a/.///b/../").lexically_normal() == "a/");
    assert(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d");
    assert(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c");
    assert(fs::path("a/b/c").lexically_relative("a") == "b/c");
    assert(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
    assert(fs::path("a/b/c").lexically_relative("a/b/c") == ".");
    assert(fs::path("a/b").lexically_relative("c/d") == "../../a/b");
    assert(fs::path("a/b").lexically_relative("/a/b") == "");
    assert(fs::path("a/b").lexically_proximate("/a/b") == "a/b");
}


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

IDAplicado aComportamiento según lo publicadoComportamiento correcto
LWG 3070C++17Un nombre de archivo que también puede ser un nombre-raíz puede causar resultados sorpresivos.Se trata como un caso de error.
LWG 3096C++17La secuencias "/" y "/." al final se manejan incorrectamente.Se corrigió el manejo.

[editar] Véase también

Compone una ruta de acceso relativa.
(función) [editar]