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
주어진 파일 상태나 경로가 존재하는 파일·디렉터리에 해당하는지 검사해요.
-
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 statusp— 검사할 경로ec— 예외 없는 버전에서 오류 보고용 출력 매개변수
반환값
주어진 경로나 파일 상태가 존재하는 파일·디렉터리에 해당하면 true, 아니면 false예요.
예외
noexcept로 표시되지 않은 오버로드는 메모리 할당이 실패하면 std::bad_alloc을 던질 수 있어요.
-
- OS API 오류가 있으면
p를 첫 경로 인자, OS 오류 코드를 오류 코드 인자로 삼아std::filesystem::filesystem_error를 던져요.
- OS API 오류가 있으면
-
- OS API 호출이 실패하면
error_code&매개변수에 OS 오류 코드를 설정하고, 오류가 없다면ec.clear()를 실행해요.
- OS API 호출이 실패하면
객체가 존재하지 않는다고 해서 파일시스템 예외를 던지지 않아요(반환값을 사용하세요).
참고
이 함수가 제공하는 정보는 보통 디렉터리 순회의 부산물로도 얻을 수 있어요. 디렉터리를 순회하는 동안 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