std::filesystem:: canonical, std::filesystem:: weakly_canonical
From cppreference.net
<
cpp
|
filesystem
|
헤더 파일에 정의됨
<filesystem>
|
||
|
path canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(1) | (C++17부터) |
|
path canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(2) | (C++17부터) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(3) | (C++17부터) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(4) | (C++17부터) |
1,2)
경로
p
를 정규 절대 경로로 변환합니다. 즉, 일반 형식 표현에서 점, 점-점 요소 또는 심볼릭 링크가 없는 절대 경로입니다. 만약
p
가 절대 경로가 아닌 경우, 이 함수는
std::
filesystem
::
absolute
(
p
)
에 의해 먼저 절대 경로로 만들어진 것처럼 동작합니다. 경로
p
는 반드시 존재해야 합니다.
3,4)
존재하는 (
status
(
p
)
또는
status
(
p, ec
)
로 결정된)
p
의 선행 요소들로 구성된 경로 인자를 사용하여
canonical()
를 호출한 결과에
operator
/
=
로 구성된 경로를 반환합니다. 존재하지 않는
p
의 요소들이 뒤따릅니다. 결과 경로는
정규 형식
입니다.
목차 |
매개변수
| p | - |
절대 경로 또는 상대 경로일 수 있는 경로;
canonical
의 경우 반드시 존재하는 경로여야 함
|
| ec | - | 오류 상태를 저장할 에러 코드 |
반환값
1,2)
std::
filesystem
::
absolute
(
p
)
와 동일한 파일로 확인되는 절대 경로.
3,4)
정규 경로는
canonical
(
x
)
/
y
형태를 가지며, 여기서
x
는
p
에 존재하는 요소들의 가장 긴 선행 시퀀스로 구성된 경로이고,
y
는
p
의 나머지 존재하지 않는 후행 요소들로 구성된 경로입니다.
예외
noexcept
로 표시되지 않은 모든 오버로드는 메모리 할당이 실패할 경우
std::bad_alloc
을(를) throw할 수 있습니다.
1,3)
기본 OS API 오류 발생 시
std::filesystem::filesystem_error
를 발생시킵니다. 이는
p
를 첫 번째 경로 인수로, OS 오류 코드를 오류 코드 인수로 구성하여 생성됩니다.
2,4)
OS API 호출이 실패할 경우
std::
error_code
&
매개변수를 OS API 오류 코드로 설정하고, 오류가 발생하지 않을 경우
ec.
clear
(
)
를 실행합니다.
참고 사항
canonical()
함수는 POSIX
realpath
를 모델로 하여 설계되었습니다.
weakly_canonical()
함수는
relative()
의 연산 의미론을 단순화하기 위해 도입되었습니다.
예제
이 코드 실행
#include <filesystem> #include <iostream> int main() { /* 샌드박스 디렉토리 설정: a └── b ├── c1 │ └── d <== 현재 경로 └── 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-such-file"); std::cout << "현재 경로는 " << std::filesystem::current_path() << '\n' << "에 대한 정규 경로는 " << p1 << " " << std::filesystem::canonical(p1) << '\n' << "에 대한 약한 정규 경로는 " << p2 << " " << std::filesystem::weakly_canonical(p2) << '\n'; try { [[maybe_unused]] auto x_x = std::filesystem::canonical(p2); // 도달 불가 } catch (const std::exception& ex) { std::cout << "에 대한 정규 경로가 예외를 발생시켰습니다:\n" << p2 << " " << ex.what() << '\n'; } // 정리 작업 std::filesystem::current_path(old); const auto count = std::filesystem::remove_all(tmp / "a"); std::cout << "파일 또는 디렉토리 " << count << "개를 삭제했습니다.\n"; }
가능한 출력:
현재 경로는 "/tmp/a/b/c1/d" 에 대한 정규 경로는 "../../c2/./e" "/tmp/a/b/c2/e" 에 대한 약한 정규 경로는 "../no-such-file" "/tmp/a/b/c1/no-such-file" 에 대한 정규 경로가 예외를 발생시켰습니다: "../no-such-file" filesystem error: in canonical: No such file or directory [../no-such-file] [/tmp/a/b/c1/d] 파일 또는 디렉토리 6개를 삭제했습니다.
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2956 | C++17 |
canonical
함수에 불필요한
base
매개변수가 있음
|
제거됨 |
참고 항목
|
(C++17)
|
경로를 표현함
(클래스) |
|
(C++17)
|
절대 경로를 구성함
(함수) |
|
(C++17)
|
상대 경로를 구성함
(함수) |