Namespaces
Variants

std::experimental::filesystem:: is_character_file

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

指定されたファイルステータスまたはパスが、POSIXの S_ISCHR によって判定されるように、キャラクタ特殊ファイルに対応するかどうかをチェックします。キャラクタ特殊ファイルの例としては、Linuxにおける / dev / null / dev / tty / dev / audio 、または / dev / nvram などのキャラクタデバイスが挙げられます。

1) 次と同等: s. type ( ) == file_type :: character .
2) 次と等価: is_character_file ( status ( p ) ) または is_character_file ( status ( p, ec ) ) それぞれ。

目次

パラメータ

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

戻り値

true が返されるのは、 p で示されるファイル、または s で示される型がブロックデバイスを参照している場合である。 false が返されるのはそれ以外の場合。非スローオーバーロードはエラー発生時に 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_character_file(*iterator) を呼び出すことは、 is_character_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;
    // 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");
    std::ofstream("sandbox/file"); // create regular 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");
    // 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
    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 の公開メンバ関数)