Namespaces
Variants

std::filesystem:: is_character_file

From cppreference.net
헤더 파일에 정의됨 <filesystem>
bool is_character_file ( std:: filesystem :: file_status s ) noexcept ;
(1) (C++17부터)
bool is_character_file ( const std:: filesystem :: path & p ) ;
(2) (C++17부터)
bool is_character_file ( const std:: filesystem :: path & p, std:: error_code & ec ) noexcept ;
(3) (C++17부터)

주어진 파일 상태나 경로가 POSIX S_ISCHR 에 의해 결정된 것처럼 문자 특수 파일에 해당하는지 확인합니다. 문자 특수 파일의 예로는 Linux에서 / dev / null , / dev / tty , / dev / audio , 또는 / dev / nvram 와 같은 문자 장치들이 있습니다.

1) 다음과 동일함: s. type ( ) == file_type :: character .
2,3) 다음에 해당합니다: is_character_file ( status ( p ) ) 또는 is_character_file ( status ( p, ec ) ) 각각.

목차

매개변수

s - 확인할 파일 상태
p - 검사할 경로
ec - non-throwing 오버로드에서 오류 보고를 위한 출력 매개변수

반환값

true 만약 p 로 지정된 파일 또는 s 로 지정된 타입이 문자 장치를 참조하는 경우, false 그렇지 않은 경우. 비예외 발생 오버로드는 오류 발생 시 false 를 반환합니다.

예외

noexcept 로 표시되지 않은 모든 오버로드는 메모리 할당이 실패할 경우 std::bad_alloc 을(를) throw할 수 있습니다.

2,3) OS API 호출이 실패할 경우 std:: error_code & 매개변수를 OS API 오류 코드로 설정하고, 오류가 발생하지 않을 경우 ec. clear ( ) 를 실행합니다.

예제

#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;
    // alternative: 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

참고 항목

(C++17) (C++17)
파일 속성을 결정합니다
심볼릭 링크 대상을 확인하며 파일 속성을 결정합니다
(함수)
파일 유형과 권한을 나타냅니다
(클래스)
파일 상태가 알려져 있는지 확인합니다
(함수)
주어진 경로가 블록 장치를 참조하는지 확인합니다
(함수)
주어진 경로가 디렉터리를 참조하는지 확인합니다
(함수)
(C++17)
주어진 경로가 명명된 파이프를 참조하는지 확인합니다
(함수)
(C++17)
인수가 기타 파일을 참조하는지 확인합니다
(함수)
인수가 일반 파일을 참조하는지 확인합니다
(함수)
(C++17)
인수가 명명된 IPC 소켓을 참조하는지 확인합니다
(함수)
(C++17)
인수가 심볼릭 링크를 참조하는지 확인합니다
(함수)
(C++17)
경로가 존재하는 파일 시스템 객체를 참조하는지 확인합니다
(함수)
디렉터리 항목이 문자 장치를 참조하는지 확인합니다
( std::filesystem::directory_entry 의 공개 멤버 함수)