std::filesystem::path:: lexically_normal, std::filesystem::path:: lexically_relative, std::filesystem::path:: lexically_proximate
From cppreference.net
<
cpp
|
filesystem
|
path
|
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 이후) |
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 | 후행 "/" 및 "/."이 잘못 처리됨 | 수정됨 |
참고 항목
|
(C++17)
|
상대 경로를 구성함
(function) |