Namespaces
Variants

std::filesystem:: file_type

From cppreference.net
定義済みヘッダー <filesystem>
enum class file_type {

none = /* unspecified */ ,
not_found = /* unspecified */ ,
regular = /* unspecified */ ,
directory = /* unspecified */ ,
symlink = /* unspecified */ ,
block = /* unspecified */ ,
character = /* unspecified */ ,
fifo = /* unspecified */ ,
socket = /* unspecified */ ,
unknown = /* unspecified */ ,
/* implementation-defined */

} ;
(C++17以降)

file_type は、パスが参照するファイルまたはディレクトリのタイプを示す定数を定義します。列挙子の値はそれぞれ異なります。

定数

列挙子 意味
none ファイルステータスがまだ評価されていないか、評価中にエラーが発生したことを示す
not_found ファイルが見つからなかったことを示す(これはエラーとは見なされない)
regular 通常ファイル
directory ディレクトリ
symlink シンボリックリンク
block ブロック特殊ファイル
character キャラクタ特殊ファイル
fifo FIFO(パイプとも呼ばれる)ファイル
socket ソケットファイル
unknown ファイルは存在するが、そのタイプを特定できなかった
implementation-defined 実装でサポートされる追加のファイルタイプごとの実装定義の定数(例:MSVC STLは junction NTFSジャンクション 用に定義している)

#include <cstdio>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::filesystem;
void demo_status(const fs::path& p, fs::file_status s)
{
    std::cout << p;
    switch (s.type())
    {
        case fs::file_type::none:
            std::cout << " は `not-evaluated-yet` 型を持っています";
            break;
        case fs::file_type::not_found:
            std::cout << " は存在しません";
            break;
        case fs::file_type::regular:
            std::cout << " は通常ファイルです";
            break;
        case fs::file_type::ディレクトリ:
            std::cout << " はディレクトリです";
            break;
        case fs::file_type::symlink:
            std::cout << " はシンボリックリンクです";
            break;
        case fs::file_type::ブロック:
            std::cout << " はブロックデバイスです";
            break;
        case fs::file_type::character:
            std::cout << " は文字デバイスです";
            break;
        case fs::file_type::fifo:
            std::cout << " は名前付き IPC パイプです";
            break;
        case fs::file_type::socket:
            std::cout << " は名前付き IPC ソケットです";
            break;
        case fs::file_type::unknown:
            std::cout << " は `unknown` 型を持っています";
            break;
        default:
            std::cout << " は `implementation-defined` 型を持ちます";
            break;
    }
    std::cout << '\n';
}
int main()
{
    // 異なる種類のファイルを作成する
    fs::create_directory("サンドボックス");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/file"}; // 通常ファイルを作成
    fs::create_symlink("ファイル", "sandbox/symlink");
    mkfifo("sandbox/pipe", 0644);
    sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    std::strcpy(addr.sun_path, "sandbox/sock");
    int fd = socket(PF_UNIX, SOCK_STREAM, 0);
    bind(fd, reinterpret_cast<sockaddr*>(&addr), sizeof addr);
    // 様々なステータスアクセサのデモ
    for (auto it{fs::directory_iterator("サンドボックス")}; it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // ディレクトリエントリからキャッシュされたステータスを使用
    demo_status("/dev/null", fs::ステータス("/dev/null")); // statusへの直接呼び出し
    demo_status("/dev/sda", fs::ステータス("/dev/sda"));
    demo_status("sandbox/no", fs::ステータス("/sandbox/no"));
    // クリーンアップ (std::unique_ptrベースのカスタム削除機能を推奨)
    close(fd);
    fs::remove_all("サンドボックス");
}

出力例:

"sandbox/file" は通常ファイルです
"sandbox/dir" はディレクトリです
"sandbox/pipe" は名前付きIPCパイプです
"sandbox/sock" は名前付きIPCソケットです
"sandbox/symlink" はシンボリックリンクです
"/dev/null" はキャラクターデバイスです
"/dev/sda" はブロックデバイスです
"sandbox/no" は存在しません

関連項目

ファイルタイプとパーミッションを表す
(クラス)
指定されたパスがブロックデバイスを参照するかどうかをチェックする
(関数)
指定されたパスがキャラクターデバイスを参照するかどうかをチェックする
(関数)
指定されたパスがディレクトリを参照するかどうかをチェックする
(関数)
(C++17)
指定されたパスが名前付きパイプを参照するかどうかをチェックする
(関数)
(C++17)
引数が その他 のファイルを参照するかどうかをチェックする
(関数)
(C++17)
引数が名前付きIPCソケットを参照するかどうかをチェックする
(関数)
(C++17)
引数がシンボリックリンクを参照するかどうかをチェックする
(関数)
ディレクトリエントリが通常ファイルを参照するかどうかをチェックする
( std::filesystem::directory_entry の公開メンバー関数)