Namespaces
Variants

std::filesystem::directory_entry:: status, std::filesystem::directory_entry:: symlink_status

From cppreference.net
(1) (C++17以降)
(2) (C++17以降)
std:: filesystem :: file_status symlink_status ( ) const ;
(3) (C++17以降)
std:: filesystem :: file_status symlink_status ( std:: error_code & ec ) const noexcept ;
(4) (C++17以降)
1,2) エントリのステータスを返します。これは filesystem::status 呼び出しによって決定されるものと同様です(シンボリックリンクはそのターゲットに従います)。
3,4) エントリのステータスを返します。これは filesystem::symlink_status 呼び出しによって決定されるものと同様です(シンボリックリンクは追従されません)。

目次

パラメータ

ec - 非スローオーバーロードでのエラー報告用出力パラメータ

戻り値

エントリによって参照されるファイルのステータス。

例外

noexcept でマークされていないオーバーロードは、 メモリ確保に失敗した場合 std::bad_alloc をスローする可能性があります。

1,3) 基盤となるOS APIエラーが発生した場合 std::filesystem::filesystem_error をスローします。これは p を第一パス引数、OSエラーコードをエラーコード引数として構築されます。
2,4) OS API呼び出しが失敗した場合、 std:: error_code & パラメータをOS APIエラーコードに設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。

注記

多くの低レベルOS APIは、ディレクトリ走査時に次のディレクトリエントリとともにファイル属性も取得します。 std::filesystem::directory_iterator のコンストラクタと非constメンバ関数は、これらの属性(もしあれば)を指し示す std::filesystem::directory_entry に保存します。これは directory_entry::refresh を呼び出すことなく行われるため、追加のシステムコールを必要とせずに、ディレクトリエントリの属性をイテレーション中に検査することが可能になります。

#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::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()
{
    // 異なる種類のファイルを作成
    fs::create_directory("sandbox");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/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);
    // 異なるステータスアクセサのデモ
    for (auto it{fs::directory_iterator("sandbox")}; it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // ディレクトリエントリからキャッシュされたステータスを使用
    demo_status("/dev/null", fs::status("/dev/null")); // statusへの直接呼び出し
    demo_status("/dev/sda", fs::status("/dev/sda"));
    demo_status("sandbox/no", fs::status("/sandbox/no"));
    // クリーンアップ(std::unique_ptrベースのカスタム削除子を推奨)
    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

関連項目

キャッシュされたファイル属性を更新する
(公開メンバ関数)
ディレクトリエントリが既存のファイルシステムオブジェクトを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリがブロックデバイスを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリがキャラクタデバイスを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリがディレクトリを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリが名前付きパイプを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリが その他 のファイルを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリが通常ファイルを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリが名前付きIPCソケットを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリがシンボリックリンクを参照しているかチェックする
(公開メンバ関数)
ディレクトリエントリが参照するファイルのサイズを返す
(公開メンバ関数)
ディレクトリエントリが参照するファイルを指すハードリンクの数を返す
(公開メンバ関数)
ディレクトリエントリが参照するファイルの最終データ更新時刻を取得する
(公開メンバ関数)