Namespaces
Variants

std::experimental::filesystem:: is_block_file

From cppreference.net
ヘッダーで定義 <experimental/filesystem>
bool is_block_file ( file_status s ) ;
(1) (filesystem TS)
bool is_block_file ( const path & p ) ;
bool is_block_file ( const path & p, error_code & ec ) noexcept ;
(2) (filesystem TS)

指定されたファイルステータスまたはパスが、POSIXの S_ISBLK によって判定されるように、ブロック特殊ファイルに対応するかどうかをチェックします。ブロック特殊ファイルの例としては、Linuxにおける / dev / sda / dev / loop0 などのブロックデバイスがあります。

1) s. type ( ) == file_type :: block と等価。
2) 次と同等: is_block_file ( status ( p ) ) または is_block_file ( status ( p, ec ) )

目次

パラメータ

s - チェックするファイルステータス
p - 検査するパス
ec - 非スローオーバーロードでのエラー報告用出力パラメータ

戻り値

true が返されるのは、 p で示されるファイル、または s で示される型がブロックデバイスを参照している場合です。非スローオーバーロードは、エラーが発生した場合に false を返します。

例外

1)
noexcept 指定子:
noexcept
2) error_code & パラメータを取らないオーバーロードは、基盤となるOS APIエラーが発生した場合に filesystem_error をスローします。これは p を第1引数、OSエラーコードをエラーコード引数として構築されます。 std:: bad_alloc はメモリ確保が失敗した場合にスローされる可能性があります。 error_code & パラメータを取るオーバーロードは、OS API呼び出しが失敗した場合にそれをOS APIエラーコードに設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。このオーバーロードは
noexcept 指定子を持ちます:
noexcept

注記

この関数によって提供される情報は、通常、ディレクトリ走査の副産物としても提供されます。ディレクトリ走査中に is_block_file(*iterator) を呼び出すことは、 is_block_file(iterator->status()) よりも効率が劣ります。

#include <cstdio>
#include <cstring>
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::experimental::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 << " は通常ファイルです\n";
    if (fs::is_directory(s))
        std::cout << " はディレクトリです\n";
    if (fs::is_block_file(s))
        std::cout << " はブロックデバイスです\n";
    if (fs::is_character_file(s))
        std::cout << " はキャラクターデバイスです\n";
    if (fs::is_fifo(s))
        std::cout << " は名前付きIPCパイプです\n";
    if (fs::is_socket(s))
        std::cout << " は名前付きIPCソケットです\n";
    if (fs::is_symlink(s))
        std::cout << " はシンボリックリンクです\n";
    if (!fs::exists(s))
        std::cout << " は存在しません\n";
}
int main()
{
    // 異なる種類のファイルを作成
    fs::create_directory("sandbox");
    std::ofstream("sandbox/file"); // 通常ファイルを作成
    fs::create_directory("sandbox/dir");
    mkfifo("sandbox/pipe", 0644);
    struct 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, (struct sockaddr*)&addr, sizeof addr);
    fs::create_symlink("file", "sandbox/symlink");
    // 異なるステータスアクセサのデモ
    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"));
    // クリーンアップ
    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ソケットを参照しているかチェックする
(関数)
引数がシンボリックリンクを参照しているかチェックする
(関数)
パスが既存のファイルシステムオブジェクトを参照しているかチェックする
(関数)
このディレクトリエントリによって指定されたファイルのキャッシュされたステータス
このディレクトリエントリによって指定されたファイルのキャッシュされたsymlink_status
( std::experimental::filesystem::directory_entry の公開メンバ関数)