Namespaces
Variants

std::filesystem:: directory_iterator

From cppreference.net
헤더 파일에 정의됨 <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

ranges:: enable_borrowed_range < std :: filesystem :: directory_iterator > = true ;
(C++20부터)
template <>

constexpr bool

ranges:: enable_view < std :: filesystem :: directory_iterator > = true ;
(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 도 아님 둘 다 해당됨

참고 항목

디렉터리와 그 하위 디렉터리의 내용에 대한 반복자
(클래스)
디렉터리 내용 순회를 위한 옵션들
(열거형)
디렉터리 항목
(클래스)