std::filesystem::status, std::filesystem::symlink_status
From cppreference.com
< cpp | filesystem
| ヘッダー <filesystem> で定義 |
||
| std::filesystem::file_status status( const std::filesystem::path& p ); |
(1) | (C++17以降) |
| std::filesystem::file_status status( const std::filesystem::path& p, std::error_code& ec ) noexcept; |
(2) | (C++17以降) |
| std::filesystem::file_status symlink_status( const std::filesystem::path& p ); |
(3) | (C++17以降) |
| std::filesystem::file_status symlink_status( const std::filesystem::path& p, std::error_code& ec ) noexcept; |
(4) | (C++17以降) |
1,2) POSIX の
stat を使用して、ファイルシステムオブジェクト `p` によって識別されるファイルの種類と属性を決定します(シンボリックリンクはターゲットに追跡されます)。以降の説明では、`prms` は POSIX `struct stat` から `st_mode` を取得し、それを `std::filesystem::perms` 型に変換したものから `m & perms::mask` を計算した結果です。- もし `p` が通常のファイル(POSIX の `S_ISREG` の場合と同様)であれば、`file_status(file_type::regular, prms)` を返します。
- もし `p` がディレクトリ(POSIX の `S_ISDIR` の場合と同様)であれば、`file_status(file_type::directory, prms)` を返します。
- もし `p` がブロック特殊ファイル(POSIX の `S_ISBLK` の場合と同様)であれば、`file_status(file_type::block, prms)` を返します。
- もし `p` がキャラクター特殊ファイル(POSIX の `S_ISCHR` の場合と同様)であれば、`file_status(file_type::character, prms)` を返します。
- もし `p` が FIFO またはパイプファイル(POSIX の `S_ISFIFO` の場合と同様)であれば、`file_status(file_type::fifo, prms)` を返します。
- もし `p` がソケット(POSIX の `S_ISSOCK` の場合と同様)であれば、`file_status(file_type::socket, prms)` を返します。
- もし `p` が実装定義のファイルタイプである場合、そのタイプに対応する実装定義の `file_type` 定数 `A` を使用して `file_status(file_type::A, prms)` を返します。
- もし `p` が存在しない場合、`file_status(file_type::not_found)` を返します。
- もし `p` が存在するが、権限不足などの理由でファイル属性を決定できない場合、`file_status(file_type::unknown)` を返します。
- もし `p` が存在するかどうかも判別できないほどの障害が発生した場合、非例外オーバーロードは `ec` を設定して `file_status(file_type::none)` を返し、例外をスローするオーバーロードは `filesystem_error` をスローします。
- それ以外の場合は、`file_status(file_type::unknown, prms)` を返します。
3,4) POSIX の `lstat` を使用する(シンボリックリンクは追跡されない)場合を除き、(1,2) と同じです。
- もし `p` がシンボリックリンクであれば、`file_status(file_type::symlink)` を返します。
目次 |
[編集] パラメータ
| p | - | 検査するパス |
| エラーコード | - | 例外を投げないオーバーロードでのエラー報告のための出力パラメータ |
[編集] 戻り値
ファイルステータス(`filesystem::file_status` オブジェクト)。
[編集] 例外
noexcept とマークされていないオーバーロードは、メモリ割り当てが失敗した場合に std::bad_alloc をスローする可能性があります。
1,3) 基盤となるOS APIエラーが発生した場合、最初のパス引数として `p`、エラーコード引数としてOSのエラーコードを指定して `std::filesystem::filesystem_error` がスローされます。
2,4) OS API呼び出しが失敗した場合、OS APIのエラーコードを `std::error_code&` パラメータに設定し、エラーが発生しなかった場合は `ec.clear()` を実行します。
[編集] 注記
この関数によって提供される情報は、通常、ディレクトリのイテレーションの副産物としても提供され、`filesystem::directory_entry` のメンバ関数によって取得できます。ディレクトリのイテレーション中に `status` を再度呼び出す必要はありません。
[編集] 例
このコードを実行
#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; // alternative: switch(s.type()) { case fs::file_type::regular: ...} if (fs::is_regular_file(s)) std::cout << " is a regular file\n"; if (fs::is_directory(s)) std::cout << " is a directory\n"; if (fs::is_block_file(s)) std::cout << " is a block device\n"; if (fs::is_character_file(s)) std::cout << " is a character device\n"; if (fs::is_fifo(s)) std::cout << " is a named IPC pipe\n"; if (fs::is_socket(s)) std::cout << " is a named IPC socket\n"; if (fs::is_symlink(s)) std::cout << " is a symlink\n"; if (!fs::exists(s)) std::cout << " does not exist\n"; } int main() { // create files of different kinds fs::create_directory("sandbox"); fs::create_directory("sandbox/dir"); std::ofstream{"sandbox/file"}; // create regular file fs::create_symlink("file", "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); // demo different status accessors for (auto it{fs::directory_iterator("sandbox")}; it != fs::directory_iterator(); ++it) demo_status(*it, it->symlink_status()); // use cached status from directory entry demo_status("/dev/null", fs::status("/dev/null")); // direct calls to status demo_status("/dev/sda", fs::status("/dev/sda")); demo_status("sandbox/no", fs::status("/sandbox/no")); // cleanup (prefer std::unique_ptr-based custom deleters) close(fd); fs::remove_all("sandbox"); }
実行結果の例
"sandbox/file" is a regular file "sandbox/dir" is a directory "sandbox/pipe" is a named IPC pipe "sandbox/sock" is a named IPC socket "sandbox/symlink" is a symlink "/dev/null" is a character device "/dev/sda" is a block device "sandbox/no" does not exist
[編集] 関連項目
| (C++17) |
ファイルの種別とパーミッションを表現する (クラス) |
| (C++17) |
ファイルステータスが既知かどうかを確認する (関数) |
| (C++17) |
指定されたパスがブロックデバイスを参照しているか確認する (関数) |
| (C++17) |
指定されたパスがキャラクタデバイスを参照しているか確認する (関数) |
| (C++17) |
指定されたパスがディレクトリを参照しているか確認する (関数) |
| (C++17) |
指定されたパスが名前付きパイプを参照しているか確認する (関数) |
| (C++17) |
引数がその他のファイルを参照しているか確認する (関数) |
| (C++17) |
引数が通常ファイルを参照しているか確認する (関数) |
| (C++17) |
引数が名前付きIPCソケットを参照しているか確認する (関数) |
| (C++17) |
引数がシンボリックリンクを参照しているか確認する (関数) |
| (C++17) |
パスが既存のファイルシステムオブジェクトを参照しているか確認する (関数) |
| このディレクトリエントリによって指定されるファイルのステータス。 このディレクトリエントリによって指定されるファイル/シンボリックリンクのステータス。 ( std::filesystem::directory_entry の public メンバ関数) |