Namespaces
Variants

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

From cppreference.net
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 forma normal en su formato genérico.
2) Devuelve * this 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 root-name , devuelve un path construido 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 ( ) ) , luego
  • 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 dot ni dot-dot en [ b, base. end ( ) ) , menos el número de elementos de nombre de archivo dot-dot . Si N < 0 , devuelve un path construido por defecto,
  • de lo contrario, si N = 0 y a == end ( ) || a - > empty ( ) , devuelve path ( "." ) ,
  • de lo contrario devuelve un objeto compuesto por
  • un path ( ) construido por defecto seguido de
  • N aplicaciones de operator / = ( path ( ".." ) ) , seguido 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 vacía, devolverlo. De lo contrario devolver * this .

Contenidos

Parámetros

(ninguno)

Valor de retorno

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

Excepciones

Puede lanzar excepciones definidas por la implementación.

Notas

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

En Windows, la ruta devuelta path tiene barras invertidas (los separadores preferidos).

En POSIX, ningún nombre de archivo en una ruta relativa es aceptable como root-name .

Ejemplo

#include <cassert>
#include <filesystem>
#include <iostream>
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");
}

Informes de defectos

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

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3070 C++17 un nombre de archivo que también puede ser un root-name puede causar resultados sorprendentes tratado como caso de error
LWG 3096 C++17 el "/" final y "/." se manejan incorrectamente corregido

Véase también

compone una ruta relativa
(función)