std::filesystem:: file_type
|
定義済みヘッダー
<filesystem>
|
||
|
enum
class
file_type
{
none
=
/* unspecified */
,
|
(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)
|
指定されたパスがキャラクターデバイスを参照するかどうかをチェックする
(関数) |
|
(C++17)
|
指定されたパスがディレクトリを参照するかどうかをチェックする
(関数) |
|
(C++17)
|
指定されたパスが名前付きパイプを参照するかどうかをチェックする
(関数) |
|
(C++17)
|
引数が
その他
のファイルを参照するかどうかをチェックする
(関数) |
|
(C++17)
|
引数が名前付きIPCソケットを参照するかどうかをチェックする
(関数) |
|
(C++17)
|
引数がシンボリックリンクを参照するかどうかをチェックする
(関数) |
|
ディレクトリエントリが通常ファイルを参照するかどうかをチェックする
(
std::filesystem::directory_entry
の公開メンバー関数)
|