CodeNebula
C++17stladvanced

std::filesystem::file_type

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

Explanation

An enumeration that classifies filesystem entries into categories such as `regular`, `directory`, `symlink`, `block`, `character`, `fifo`, `socket`, `unknown`, and `not_found`.

Real-World Scenario

Route processing logic based on whether an entry is a file, directory, or symlink in a backup utility.

Quick Snippet

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

auto type = fs::status("/tmp").type();
switch (type) {
    case fs::file_type::directory: std::cout << "Directory\n"; break;
    case fs::file_type::regular:   std::cout << "Regular file\n"; break;
    case fs::file_type::symlink:   std::cout << "Symlink\n"; break;
    default:                       std::cout << "Other\n"; break;
}

Full Example

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

// std::filesystem::file_type is an enum classifying entries as regular files,
// directories, symlinks, block/character devices, FIFOs, sockets, etc.

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

namespace fs = std::filesystem;

void classify(const fs::path& p) {
    std::error_code ec;
    fs::file_status st = fs::status(p, ec);
    std::cout << p.filename().string() << " -> ";
    if (ec) {
        std::cout << "error: " << ec.message() << std::endl;
        return;
    }
    switch (st.type()) {
        case fs::file_type::none:      std::cout << "none"; break;
        case fs::file_type::not_found: std::cout << "not_found"; break;
        case fs::file_type::regular:   std::cout << "regular"; break;
        case fs::file_type::directory: std::cout << "directory"; break;
        case fs::file_type::symlink:   std::cout << "symlink"; break;
        case fs::file_type::block:     std::cout << "block"; break;
        case fs::file_type::character: std::cout << "character"; break;
        case fs::file_type::fifo:      std::cout << "fifo"; break;
        case fs::file_type::socket:    std::cout << "socket"; break;
        case fs::file_type::unknown:   std::cout << "unknown"; break;
    }
    std::cout << std::endl;
}

int main() {
    try {
        fs::path base = fs::temp_directory_path() / "cn_file_type_test";
        fs::create_directories(base / "subdir");
        { std::ofstream(base / "file.txt") << "data"; }

        // --- Classify created entries ---
        std::cout << "=== Classifying entries ===" << std::endl;
        classify(base / "file.txt");
        classify(base / "subdir");
        classify(base / "nonexistent");

        // --- Using convenience functions ---
        std::cout << "\n=== Convenience type checks ===" << std::endl;
        std::cout << "is_regular_file: " << fs::is_regular_file(base / "file.txt") << std::endl;
        std::cout << "is_directory:    " << fs::is_directory(base / "subdir") << std::endl;
        std::cout << "is_symlink:      " << fs::is_symlink(base / "file.txt") << std::endl;
        std::cout << "is_block_file:   " << fs::is_block_file(base / "file.txt") << std::endl;
        std::cout << "is_char_file:    " << fs::is_character_file(base / "file.txt") << std::endl;
        std::cout << "is_fifo:         " << fs::is_fifo(base / "file.txt") << std::endl;
        std::cout << "is_socket:       " << fs::is_socket(base / "file.txt") << std::endl;
        std::cout << "is_other:        " << fs::is_other(base / "file.txt") << std::endl;

        // --- Check temp directory itself ---
        std::cout << "\n=== Temp directory type ===" << std::endl;
        classify(fs::temp_directory_path());

        // --- Check if a status indicates emptiness ---
        std::cout << "\n=== is_empty ===" << std::endl;
        std::cout << "subdir is empty: " << fs::is_empty(base / "subdir") << std::endl;
        std::cout << "file is empty:   " << fs::is_empty(base / "file.txt") << 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:
=== Classifying entries ===
file.txt -> regular
subdir -> directory
nonexistent -> not_found

=== Convenience type checks ===
is_regular_file: 1
is_directory:    1
is_symlink:      0
is_block_file:   0
is_char_file:    0
is_fifo:         0
is_socket:       0
is_other:        0

=== Temp directory type ===
tmp -> directory

=== is_empty ===
subdir is empty: 1
file is empty:   0
*/
Run command
g++ -std=c++17 -Wall -Wextra -o example file_type.cpp -lstdc++fs