std::filesystem:: directory_iterator
|
헤더 파일에 정의됨
<filesystem>
|
||
|
class
directory_iterator
;
|
(C++17부터) | |
directory_iterator
는 디렉토리의
LegacyInputIterator
로, 디렉토리의
directory_entry
요소들을 순회합니다(하위 디렉토리는 방문하지 않음). 순회 순서는 명시되지 않으나, 각 디렉토리 엔트리는 한 번만 방문됩니다. 특수 경로명인
dot
과
dot-dot
은 생략됩니다.
만약
directory_iterator
가 오류를 보고하거나 마지막 디렉토리 항목을 지나서 진행되면, 기본 생성된 반복자(종료 반복자라고도 함)와 동일하게 됩니다. 두 개의 종료 반복자는 항상 동일하며, 종료 반복자를 역참조하거나 증가시키는 것은 정의되지 않은 동작입니다.
디렉터리 이터레이터가 생성된 후 디렉터리 트리에서 파일이나 디렉터리가 삭제되거나 추가된 경우, 해당 변경 사항이 이터레이터를 통해 관찰될지 여부는 명시되어 있지 않습니다.
목차 |
멤버 타입
| 멤버 타입 | 정의 |
value_type
|
std::filesystem::directory_entry |
difference_type
|
std::ptrdiff_t |
pointer
|
const std:: filesystem :: directory_entry * |
reference
|
const std:: filesystem :: directory_entry & |
iterator_category
|
std::input_iterator_tag |
멤버 함수
|
디렉터리 이터레이터를 생성합니다
(public member function) |
|
|
(destructor)
|
기본 소멸자
(public member function) |
|
내용을 할당합니다
(public member function) |
|
|
가리키는 항목에 접근합니다
(public member function) |
|
|
다음 항목으로 이동합니다
(public member function) |
비멤버 함수
|
범위 기반 for 루프 지원
(함수) |
또한,
operator==
와
operator!=
가
(C++20까지)
operator==
가
(C++20부터)
LegacyInputIterator
요구 사항에 따라 제공됩니다.
operator==
에서 합성될 수 있기 때문에
operator!=
가 제공되는지 여부는
명시되지 않으며,
(C++20부터)
동등성 연산자가 멤버인지 비멤버인지 여부도 명시되지 않습니다.
헬퍼 특수화
|
template
<>
constexpr
bool
|
(C++20부터) | |
|
template
<>
constexpr
bool
|
(C++20부터) | |
directory_iterator
에 대한 이러한 특수화는 이를
borrowed_range
와
view
로 만듭니다.
참고 사항
많은 저수준 OS API들은 디렉토리 순회 시 다음 디렉토리 엔트리와 함께 파일 속성들을 함께 반환합니다. std::filesystem::directory_iterator 의 생성자들과 비-const 멤버 함수들은 이러한 속성들이 있는 경우, 이를 가리키는 std::filesystem::directory_entry 내에 directory_entry::refresh 를 호출하지 않고 저장합니다. 이로 인해 추가적인 시스템 호출 없이도 디렉토리 엔트리들의 속성들을 순회 중에 조사할 수 있습니다.
예제
#include <algorithm> #include <filesystem> #include <fstream> #include <iostream> int main() { const std::filesystem::path sandbox{"sandbox"}; std::filesystem::create_directories(sandbox/"dir1"/"dir2"); std::ofstream{sandbox/"file1.txt"}; std::ofstream{sandbox/"file2.txt"}; std::cout << "directory_iterator:\n"; // directory_iterator는 범위 기반 for 루프를 사용하여 반복할 수 있음 for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) std::cout << dir_entry.path() << '\n'; std::cout << "\ndirectory_iterator as a range:\n"; // directory_iterator는 다른 방식으로도 범위처럼 동작함 std::ranges::for_each( std::filesystem::directory_iterator{sandbox}, [](const auto& dir_entry) { std::cout << dir_entry << '\n'; }); std::cout << "\nrecursive_directory_iterator:\n"; for (auto const& dir_entry : std::filesystem::recursive_directory_iterator{sandbox}) std::cout << dir_entry << '\n'; // sandbox 디렉터리와 그 안의 모든 내용(하위 디렉터리 포함) 삭제 std::filesystem::remove_all(sandbox); }
가능한 출력:
directory_iterator: "sandbox/file2.txt" "sandbox/file1.txt" "sandbox/dir1" directory_iterator as a range: "sandbox/file2.txt" "sandbox/file1.txt" "sandbox/dir1" recursive_directory_iterator: "sandbox/file2.txt" "sandbox/file1.txt" "sandbox/dir1" "sandbox/dir1/dir2"
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3480 | C++20 |
directory_iterator
는
borrowed_range
도 아니고
view
도 아님
|
둘 다 해당됨 |
참고 항목
|
(C++17)
|
디렉터리와 그 하위 디렉터리의 내용에 대한 반복자
(클래스) |
|
(C++17)
|
디렉터리 내용 순회를 위한 옵션들
(열거형) |
|
(C++17)
|
디렉터리 항목
(클래스) |