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) (C++17 이후)
path lexically_relative ( const path & base ) const ;
(2) (C++17 이후)
path lexically_proximate ( const path & base ) const ;
(3) (C++17 이후)
1) 일반 형식 으로 변환된 * this 정규 형식 으로 반환합니다.
2) * this base 에 대해 상대 경로로 변환하여 반환합니다.
  • 먼저, root_name ( ) ! = base. root_name ( ) true 이거나 is_absolute ( ) ! = base. is_absolute ( ) true 이거나 ( ! has_root_directory ( ) && base. has_root_directory ( ) ) true 이거나 relative_path ( ) 또는 base. relative_path ( ) 내의 파일 이름이 root-name 으로 해석될 수 있는 경우, 기본 생성된 path를 반환합니다.
  • 그렇지 않으면, 먼저 * this base 의 첫 번째 불일치 요소를 auto [ a, b ] = mismatch ( begin ( ) , end ( ) , base. begin ( ) , base. end ( ) ) 와 같이 결정한 후,
  • 만약 a == end ( ) 이고 b == base. end ( ) 이면, path ( "." ) 를 반환합니다,
  • 그렇지 않으면, N [ b, base. end ( ) ) 에서 비어 있지 않으면서 dot dot-dot 도 아닌 파일 이름 요소의 수에서 dot-dot 파일 이름 요소의 수를 뺀 값으로 정의합니다. 만약 N < 0 이면 기본 생성된 path를 반환합니다,
  • 그렇지 않고 N = 0 이고 a == end ( ) || a - > empty ( ) 이면, path ( "." ) 를 반환합니다,
  • 그렇지 않으면 다음으로 구성된 객체를 반환합니다:
  • 기본 생성된 path ( ) 에 이어서
  • N 번의 operator / = ( path ( ".." ) ) 적용, 그리고
  • 반개방 범위 [ a , end ( ) ) 내 각 요소에 대해 한 번씩 operator / = 를 적용합니다.
3) lexically_relative ( base ) 의 값이 빈 경로가 아닌 경우, 이를 반환합니다. 그렇지 않으면 * this 를 반환합니다.

목차

매개변수

(없음)

반환값

1) 경로의 정규 형식.
2) 경로의 상대 형태.
3) 경로의 근사 형태.

예외

구현 정의 예외를 던질 수 있습니다.

참고 사항

이러한 변환은 순전히 어휘적입니다. 이들은 경로가 존재하는지 확인하지 않으며, 심볼릭 링크를 따르지 않고, 파일 시스템에 전혀 접근하지 않습니다. lexically_relative lexically_proximate 의 심볼릭 링크 추적 버전에 대해서는 relative proximate 를 참조하십시오.

Windows에서는 반환된 path 가 백슬래시(선호되는 구분자)를 포함합니다.

POSIX에서, 상대 경로의 어떤 파일 이름도 root-name 으로 허용되지 않습니다.

예제

#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");
}

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 3070 C++17 루트 이름일 수도 있는 파일 이름이 예상치 못한 결과를 초래할 수 있음 오류 사례로 처리
LWG 3096 C++17 후행 "/" 및 "/."이 잘못 처리됨 수정됨

참고 항목

상대 경로를 구성함
(function)