std::filesystem::directory_entry:: status, std::filesystem::directory_entry:: symlink_status
From cppreference.net
<
cpp
|
filesystem
|
directory entry
|
std::
filesystem
::
file_status
status
(
)
const
;
|
(1) | (C++17부터) |
|
std::
filesystem
::
file_status
status
(
std::
error_code
&
ec
)
const
noexcept
;
|
(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) |