CodeNebula
C++17stladvanced

std::filesystem::directory_entry

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

Explanation

Represents a single entry within a directory, caching file attributes (type, size, last write time) to minimize redundant OS calls when iterating over directory contents.

Real-World Scenario

Display file metadata (name, size, type) in a file manager application.

Quick Snippet

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

fs::directory_entry entry("/home/user/docs/report.txt");
if (entry.exists()) {
    std::cout << "Size: " << entry.file_size() << " bytes\n";
    std::cout << "Is regular file: " << entry.is_regular_file() << "\n";
}

Full Example

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

// std::filesystem::directory_entry holds information about a directory entry
// including path, file type, size, and last write time. It caches status info.

#include <iostream>
#include <filesystem>
#include <fstream>
#include <chrono>

namespace fs = std::filesystem;

int main() {
    try {
        // Create a temp file to inspect
        fs::path tmp = fs::temp_directory_path() / "cn_dir_entry_test.txt";
        { std::ofstream ofs(tmp); ofs << "Hello, directory_entry!"; }

        // --- Construct a directory_entry ---
        std::cout << "=== directory_entry basics ===" << std::endl;
        fs::directory_entry entry(tmp);
        std::cout << "path:     " << entry.path() << std::endl;
        std::cout << "exists:   " << entry.exists() << std::endl;

        // --- File type queries ---
        std::cout << "\n=== Type queries ===" << std::endl;
        std::cout << "is_regular_file: " << entry.is_regular_file() << std::endl;
        std::cout << "is_directory:    " << entry.is_directory() << std::endl;
        std::cout << "is_symlink:      " << entry.is_symlink() << std::endl;

        // --- Size and time ---
        std::cout << "\n=== Size and time ===" << std::endl;
        std::cout << "file_size: " << entry.file_size() << " bytes" << std::endl;
        auto ftime = entry.last_write_time();
        auto sctp = std::chrono::time_point_cast<std::chrono::system_clock::duration>(
            ftime - fs::file_time_type::clock::now() + std::chrono::system_clock::now());
        auto time_t_val = std::chrono::system_clock::to_time_t(sctp);
        std::cout << "last_write_time: " << std::ctime(&time_t_val);

        // --- Status ---
        std::cout << "\n=== Status ===" << std::endl;
        fs::file_status st = entry.status();
        std::cout << "type is regular_file: "
                  << (st.type() == fs::file_type::regular) << std::endl;

        // --- Refresh after external change ---
        std::cout << "\n=== Refresh ===" << std::endl;
        { std::ofstream ofs(tmp); ofs << "Updated content with more data"; }
        entry.refresh();
        std::cout << "After refresh, file_size: " << entry.file_size() << " bytes" << std::endl;

        // --- Directory entry for a directory ---
        std::cout << "\n=== Directory entry ===" << std::endl;
        fs::directory_entry dir_entry(fs::temp_directory_path());
        std::cout << "temp dir exists:       " << dir_entry.exists() << std::endl;
        std::cout << "temp dir is_directory:  " << dir_entry.is_directory() << std::endl;

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

    return 0;
}

/*
Expected output (paths and times vary):
=== directory_entry basics ===
path:     "/tmp/cn_dir_entry_test.txt"
exists:   1

=== Type queries ===
is_regular_file: 1
is_directory:    0
is_symlink:      0

=== Size and time ===
file_size: 23 bytes
last_write_time: <current date/time>

=== Status ===
type is regular_file: 1

=== Refresh ===
After refresh, file_size: 30 bytes

=== Directory entry ===
temp dir exists:       1
temp dir is_directory:  1
*/
Run command
g++ -std=c++17 -Wall -Wextra -o example directory_entry.cpp -lstdc++fs