Namespaces
Variants

std::filesystem:: canonical, std::filesystem:: weakly_canonical

From cppreference.net
헤더 파일에 정의됨 <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)
절대 경로를 구성함
(함수)
상대 경로를 구성함
(함수)