CodeNebula
C++17stladvanced

std::filesystem::directory_iterator

C++17 · Practical Modern · Compiler flag: -std=c++17

Explanation

An input iterator that traverses the immediate entries of a single directory (non-recursively). It is the primary way to list files and subdirectories at one level.

Real-World Scenario

List all configuration files in a settings directory.

Quick Snippet

snippet.cpp
#include <filesystem>
namespace fs = std::filesystem;

for (const auto& entry : fs::directory_iterator("/etc/myapp")) {
    std::cout << entry.path().filename() << "\n";
}

Full Example

directory_iterator.cpp
// CodeNebula - C++17 Example: std::filesystem::directory_iterator
// Compile: g++ -std=c++17 -Wall -Wextra -o example directory_iterator.cpp -lstdc++fs

// std::filesystem::directory_iterator iterates over entries in a single
// directory (non-recursively). It supports range-based for loops.

#include <iostream>
#include <filesystem>
#include <fstream>
#include <vector>
#include <algorithm>

namespace fs = std::filesystem;

int main() {
    try {
        // Setup: create a temp directory with some files
        fs::path base = fs::temp_directory_path() / "cn_dir_iter_test";
        fs::create_directories(base / "subdir");
        { std::ofstream(base / "alpha.txt") << "A"; }
        { std::ofstream(base / "beta.txt") << "B"; }
        { std::ofstream(base / "gamma.cpp") << "C"; }

        // --- Basic iteration ---
        std::cout << "=== Directory contents ===" << std::endl;
        for (const auto& entry : fs::directory_iterator(base)) {
            std::cout << "  " << entry.path().filename()
                      << (entry.is_directory() ? " [dir]" : " [file]") << std::endl;
        }

        // --- Collect and sort entries ---
        std::cout << "\n=== Sorted entries ===" << std::endl;
        std::vector<fs::directory_entry> entries;
        for (const auto& entry : fs::directory_iterator(base)) {
            entries.push_back(entry);
        }
        std::sort(entries.begin(), entries.end(),
            [](const fs::directory_entry& a, const fs::directory_entry& b) {
                return a.path().filename() < b.path().filename();
            });
        for (const auto& e : entries) {
            std::cout << "  " << e.path().filename() << std::endl;
        }

        // --- Count entries ---
        std::cout << "\n=== Entry count ===" << std::endl;
        auto it = fs::directory_iterator(base);
        auto count = std::distance(fs::begin(it), fs::end(it));
        std::cout << "Number of entries: " << count << std::endl;

        // --- Empty directory ---
        std::cout << "\n=== Empty directory ===" << std::endl;
        fs::path empty_dir = base / "empty";
        fs::create_directory(empty_dir);
        bool is_empty = (fs::directory_iterator(empty_dir) == fs::directory_iterator{});
        std::cout << "Empty dir is empty: " << is_empty << std::endl;

        // Cleanup
        fs::remove_all(base);
    } catch (const fs::filesystem_error& e) {
        std::cerr << "Filesystem error: " << e.what() << std::endl;
    }

    return 0;
}

/*
Expected output (order may vary before sorting):
=== Directory contents ===
  alpha.txt [file]
  beta.txt [file]
  gamma.cpp [file]
  subdir [dir]

=== Sorted entries ===
  alpha.txt
  beta.txt
  gamma.cpp
  subdir

=== Entry count ===
Number of entries: 4

=== Empty directory ===
Empty dir is empty: 1
*/
Run command
g++ -std=c++17 -Wall -Wextra -o example directory_iterator.cpp -lstdc++fs