std::filesystem::exists

std::filesystem::exists (파일·디렉터리 존재 여부 확인)

주어진 파일 상태(file status)나 경로가 실제 존재하는 파일·디렉터리에 해당하는지 확인하는 함수예요. C++17부터 있어요.

출처: cppreference

본문

<filesystem> 헤더에 정의돼 있어요.

bool exists( std::filesystem::file_status s ) noexcept;          // (1) C++17
bool exists( const std::filesystem::path& p );                    // (2) C++17
bool exists( const std::filesystem::path& p, std::error_code& ec ) noexcept; // (3) C++17

주어진 파일 상태나 경로가 존재하는 파일·디렉터리에 해당하는지 검사해요.

    1. status_known(s) && s.type() != file_type::not_found와 동등해요.
  • 2,3) s를 각각 status(p) 또는 status(p, ec)로 구한 file_status라고 할 때, exists(s)를 돌려줘요(심볼릭 링크는 따라가요). 예외를 던지지 않는 쪽은 status_known(s)라면 ec.clear()를 호출해요.

매개변수

  • s — 확인할 file status
  • p — 검사할 경로
  • ec — 예외 없는 버전에서 오류 보고용 출력 매개변수

반환값

주어진 경로나 파일 상태가 존재하는 파일·디렉터리에 해당하면 true, 아니면 false예요.

예외

noexcept로 표시되지 않은 오버로드는 메모리 할당이 실패하면 std::bad_alloc을 던질 수 있어요.

    1. OS API 오류가 있으면 p를 첫 경로 인자, OS 오류 코드를 오류 코드 인자로 삼아 std::filesystem::filesystem_error를 던져요.
    1. OS API 호출이 실패하면 error_code& 매개변수에 OS 오류 코드를 설정하고, 오류가 없다면 ec.clear()를 실행해요.

객체가 존재하지 않는다고 해서 파일시스템 예외를 던지지 않아요(반환값을 사용하세요).

참고

이 함수가 제공하는 정보는 보통 디렉터리 순회의 부산물로도 얻을 수 있어요. 디렉터리를 순회하는 동안 exists(*iterator)보다 exists(iterator->status())가 더 효율적이에요.

예제

#include <cstdint>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;

void demo_exists(const fs::path& p, fs::file_status s = fs::file_status{})
{
    std::cout << p;
    if (fs::status_known(s) ? fs::exists(s) : fs::exists(p))
        std::cout << " exists\n";
    else
        std::cout << " does not exist\n";
}

int main()
{
    const fs::path sandbox{"sandbox"};
    fs::create_directory(sandbox);
    std::ofstream{sandbox/\"file\"}; // create regular file
    fs::create_symlink(\"non-existing\", sandbox/\"symlink\");

    demo_exists(sandbox);

    for (const auto& entry : fs::directory_iterator(sandbox))
        demo_exists(entry, entry.status()); // use cached status from directory entry

    fs::remove_all(sandbox);
}

출력:

"sandbox" exists
"sandbox/symlink" does not exist
"sandbox/file" exists

더 알아보기 (Learn more)

cppreference