CodeNebula
C++17stladvanced

std::filesystem::is_directory

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

Explanation

Returns `true` if the given path refers to a directory. Useful for validating user-supplied paths before attempting directory-specific operations.

Real-World Scenario

Validate that a user-provided output path is a directory before writing multiple files into it.

Quick Snippet

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

if (fs::is_directory(outputPath)) {
    // write files into the directory
} else {
    std::cerr << outputPath << " is not a directory\n";
}

Full Example

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

// std::filesystem::is_directory() checks if a path refers to a directory.
// It follows symlinks. Use symlink_status to check without following.

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

namespace fs = std::filesystem;

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

        // --- Check directories ---
        std::cout << "=== Directory checks ===" << std::endl;
        std::cout << "is_directory(base):   " << fs::is_directory(base) << std::endl;
        std::cout << "is_directory(subdir): " << fs::is_directory(base / "subdir") << std::endl;
        std::cout << "is_directory(temp):   " << fs::is_directory(fs::temp_directory_path()) << std::endl;

        // --- Check files ---
        std::cout << "\n=== File checks ===" << std::endl;
        std::cout << "is_directory(file): " << fs::is_directory(file) << std::endl;

        // --- Check non-existent ---
        std::cout << "\n=== Non-existent ===" << std::endl;
        std::cout << "is_directory(ghost): " << fs::is_directory(base / "ghost") << std::endl;

        // --- Using file_status ---
        std::cout << "\n=== Using file_status ===" << std::endl;
        fs::file_status dir_st = fs::status(base);
        fs::file_status file_st = fs::status(file);
        std::cout << "is_directory(dir status):  " << fs::is_directory(dir_st) << std::endl;
        std::cout << "is_directory(file status): " << fs::is_directory(file_st) << std::endl;

        // --- Practical: filter directories from listing ---
        std::cout << "\n=== Filter directories ===" << std::endl;
        { std::ofstream(base / "a.txt") << "a"; }
        fs::create_directory(base / "dir2");
        for (const auto& entry : fs::directory_iterator(base)) {
            if (fs::is_directory(entry.status())) {
                std::cout << "  [DIR]  " << entry.path().filename().string() << std::endl;
            } else {
                std::cout << "  [FILE] " << entry.path().filename().string() << std::endl;
            }
        }

        // --- Error code variant ---
        std::cout << "\n=== Error handling ===" << std::endl;
        std::error_code ec;
        bool result = fs::is_directory(base, ec);
        std::cout << "is_directory: " << result << ", error: " << ec.message() << 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 of listing may vary):
=== Directory checks ===
is_directory(base):   1
is_directory(subdir): 1
is_directory(temp):   1

=== File checks ===
is_directory(file): 0

=== Non-existent ===
is_directory(ghost): 0

=== Using file_status ===
is_directory(dir status):  1
is_directory(file status): 0

=== Filter directories ===
  [FILE] a.txt
  [DIR]  dir2
  [FILE] file.txt
  [DIR]  subdir

=== Error handling ===
is_directory: 1, error: Success
*/
Run command
g++ -std=c++17 -Wall -Wextra -o example is_directory.cpp -lstdc++fs