Namespaces
Variants

std::filesystem::directory_entry:: status, std::filesystem::directory_entry:: symlink_status

From cppreference.net
(1) (C++17부터)
(2) (C++17부터)
std:: filesystem :: file_status symlink_status ( ) const ;
(3) (C++17부터)
std:: filesystem :: file_status symlink_status ( std:: error_code & ec ) const noexcept ;
(4) (C++17부터)
1,2) 항목의 상태를 반환합니다. 마치 filesystem::status 호출로 결정된 것처럼 (심볼릭 링크는 대상까지 따라감).
3,4) 항목의 상태를 반환합니다. 마치 filesystem::symlink_status 호출에 의해 결정된 것처럼 (심볼릭 링크는 따르지 않음).

목차

매개변수

ec - 비예외 발생 오버로드에서 오류 보고를 위한 출력 매개변수

반환값

항목이 참조하는 파일의 상태입니다.

예외

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 ( ) 를 실행합니다.

참고 사항

많은 저수준 OS API들은 디렉터리 순회 시 다음 디렉터리 엔트리와 함께 파일 속성들을 함께 반환합니다. std::filesystem::directory_iterator 의 생성자들과 비-const 멤버 함수들은 이러한 속성들이 있을 경우, 이를 가리키는 std::filesystem::directory_entry 내에 directory_entry::refresh 를 호출하지 않고 저장합니다. 이로 인해 추가적인 시스템 호출 없이도 디렉터리 엔트리들의 속성들을 순회 중에 조사할 수 있게 됩니다.

예제

#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::regular: ...}
    if (fs::is_regular_file(s))
        std::cout << " is a regular file\n";
    if (fs::is_directory(s))
        std::cout << " is a directory\n";
    if (fs::is_block_file(s))
        std::cout << " is a block device\n";
    if (fs::is_character_file(s))
        std::cout << " is a character device\n";
    if (fs::is_fifo(s))
        std::cout << " is a named IPC pipe\n";
    if (fs::is_socket(s))
        std::cout << " is a named IPC socket\n";
    if (fs::is_symlink(s))
        std::cout << " is a symlink\n";
    if (!fs::exists(s))
        std::cout << " does not exist\n";
}
int main()
{
    // 다양한 종류의 파일 생성
    fs::create_directory("sandbox");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/file"}; // 일반 파일 생성
    fs::create_symlink("file", "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("sandbox")}; 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");
}

가능한 출력:

"sandbox/file" is a regular file
"sandbox/dir" is a directory
"sandbox/pipe" is a named IPC pipe
"sandbox/sock" is a named IPC socket
"sandbox/symlink" is a symlink
"/dev/null" is a character device
"/dev/sda" is a block device
"sandbox/no" does not exist

참고 항목

캐시된 파일 속성을 갱신합니다
(public member function)
디렉토리 항목이 존재하는 파일 시스템 객체를 참조하는지 확인합니다
(public member function)
디렉토리 항목이 블록 장치를 참조하는지 확인합니다
(public member function)
디렉토리 항목이 문자 장치를 참조하는지 확인합니다
(public member function)
디렉토리 항목이 디렉토리를 참조하는지 확인합니다
(public member function)
디렉토리 항목이 명명된 파이프를 참조하는지 확인합니다
(public member function)
디렉토리 항목이 기타 파일을 참조하는지 확인합니다
(public member function)
디렉토리 항목이 일반 파일을 참조하는지 확인합니다
(public member function)
디렉토리 항목이 명명된 IPC 소켓을 참조하는지 확인합니다
(public member function)
디렉토리 항목이 심볼릭 링크를 참조하는지 확인합니다
(public member function)
디렉토리 항목이 참조하는 파일의 크기를 반환합니다
(public member function)
디렉토리 항목이 참조하는 파일을 가리키는 하드 링크의 수를 반환합니다
(public member function)
디렉토리 항목이 참조하는 파일의 마지막 데이터 수정 시간을 가져옵니다
(public member function)