Namespaces
Variants

std::filesystem:: file_type

From cppreference.net
헤더 파일에 정의됨 <filesystem>
enum class file_type {

none = /* unspecified */ ,
not_found = /* unspecified */ ,
regular = /* unspecified */ ,
directory = /* unspecified */ ,
symlink = /* unspecified */ ,
block = /* unspecified */ ,
character = /* unspecified */ ,
fifo = /* unspecified */ ,
socket = /* unspecified */ ,
unknown = /* unspecified */ ,
/* implementation-defined */

} ;
(C++17부터)

file_type 는 경로가 참조하는 파일 또는 디렉터리의 유형을 나타내는 상수를 정의합니다. 열거자의 값들은 각각 고유합니다.

상수

열거자 의미
none 파일 상태가 아직 평가되지 않았거나 평가 중 오류가 발생했음을 나타냅니다
not_found 파일을 찾을 수 없음을 나타냅니다 (이는 오류로 간주되지 않습니다)
regular 일반 파일
directory 디렉터리
symlink 심볼릭 링크
block 블록 특수 파일
character 문자 특수 파일
fifo FIFO (파이프라고도 함) 파일
socket 소켓 파일
unknown 파일이 존재하지만 해당 유형을 확인할 수 없음
implementation-defined 구현에서 지원하는 각 추가 파일 유형에 대한 구현 정의 상수 (예: MSVC STL은 junction NTFS 정션 에 대해 정의함)

예제

#include <cstdio>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::filesystem;
void demo_status(const fs::path& p, fs::file_status s)
{
    std::cout << p;
    switch (s.type())
    {
        case fs::file_type::none:
            std::cout << "는 `not-evaluated-yet` 타입을 가집니다";
            break;
        case fs::file_type::not_found:
            std::cout << " does not exist";
            break;
        case fs::file_type::일반:
            std::cout << "는 일반 파일입니다";
            break;
        case fs::file_type::디렉토리:
            std::cout << "는 디렉터리입니다";
            break;
        case fs::file_type::symlink:
            std::cout << "는 심볼릭 링크입니다";
            break;
        case fs::file_type::block:
            std::cout << "는 블록 장치입니다";
            break;
        case fs::file_type::character:
            std::cout << "는 문자 장치입니다";
            break;
        case fs::file_type::fifo:
            std::cout << "는 명명된 IPC 파이프입니다";
            break;
        case fs::file_type::socket:
            std::cout << "는 명명된 IPC 소켓입니다";
            break;
        case fs::file_type::unknown:
            std::cout << " has `unknown` type";
            break;
        default:
            std::cout << "는 `implementation-defined` 타입을 가집니다";
            break;
    }
    std::cout << '\n';
}
int main()
{
    // 다양한 종류의 파일 생성
    fs::create_directory("샌드박스");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/file"}; // 정규 파일 생성
    fs::create_symlink("파일", "sandbox/symlink");
    mkfifo("sandbox/pipe", 0644);
    sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    std::strcpy(addr.sun_path, "sandbox/sock");
    int fd = socket(PF_UNIX, SOCK_STREAM, 0);
    bind(fd, reinterpret_cast<sockaddr*>(&addr), sizeof addr);
    // 다양한 상태 접근자 데모
    for (auto it{fs::directory_iterator("샌드박스")}; it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // 디렉토리 엔트리에서 캐시된 상태 사용
    demo_status("/dev/null", fs::status("/dev/null")); // status에 대한 직접 호출
    demo_status("/dev/sda", fs::status("/dev/sda"));
    demo_status("sandbox/no", fs::status("/sandbox/no"));
    // 정리 (std::unique_ptr 기반 커스텀 삭제자를 선호)
    close(fd);
    fs::remove_all("샌드박스");
}

가능한 출력:

"sandbox/file"는 일반 파일입니다
"sandbox/dir"는 디렉토리입니다
"sandbox/pipe"는 명명된 IPC 파이프입니다
"sandbox/sock"는 명명된 IPC 소켓입니다
"sandbox/symlink"는 심볼릭 링크입니다
"/dev/null"는 문자 장치입니다
"/dev/sda"는 블록 장치입니다
"sandbox/no"는 존재하지 않습니다

참고 항목

파일 유형과 권한을 나타냄
(클래스)
주어진 경로가 블록 장치를 참조하는지 확인
(함수)
주어진 경로가 문자 장치를 참조하는지 확인
(함수)
주어진 경로가 디렉터리를 참조하는지 확인
(함수)
(C++17)
주어진 경로가 명명된 파이프를 참조하는지 확인
(함수)
(C++17)
인수가 기타 파일을 참조하는지 확인
(함수)
(C++17)
인수가 명명된 IPC 소켓을 참조하는지 확인
(함수)
(C++17)
인수가 심볼릭 링크를 참조하는지 확인
(함수)
디렉터리 항목이 일반 파일을 참조하는지 확인
( std::filesystem::directory_entry 의 공개 멤버 함수)