std::experimental::filesystem::is_character_file

来自cppreference.com
< cpp‎ | experimental‎ | fs
 
 
实验性
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行扩展 (并行 TS)
并行扩展 2 (并行 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
实验性非 TS 功能特性
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
在标头 <experimental/filesystem> 定义
bool is_character_file( file_status s );
(1) (文件系统 TS)
bool is_character_file( const path& p );
bool is_character_file( const path& p, error_code& ec );
(2) (文件系统 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 - 用于无抛出重载中报告错误的输出形参

返回值

如果 p 指定的文件或 s 指定的类型代表某个块设备则为 true,否则为 false。当发生错误时无抛出重载返回 false

异常

1)
noexcept 规定:  
noexcept
  
2) 不接受 error_code& 形参的重载,在发生底层 OS API 错误时抛出 filesystem_error,它以 p 为第一实参并以 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;
    // 也可以: 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" 是常规文件
"sandbox/dir" 是目录
"sandbox/pipe" 是命名 IPC 管道
"sandbox/sock" 是命名 IPC 套接字
"sandbox/symlink" 是符号链接
"dev/null" 是字符设备
"dev/sda" 是块设备
"sandbox/no" 不存在

参阅

确定文件属性
确定文件属性,检查符号链接目标
(函数)
表示文件类型及权限
(类)
检查文件状态是否已知
(函数)
检查给定路径是否指代块设备
(函数)
检查给定路径是否指代一个目录
(函数)
检查给定路径是否指代一个命名管道
(函数)
检查参数是否指代一个其他文件
(函数)
检查实参是否指代一个常规文件
(函数)
检查实参是否指代一个具名 IPC 套接字
(函数)
检查实参是否指代一个符号链接
(函数)
检查路径是否指代既存的文件系统对象
(函数)
缓存的此目录项所代表的文件的 status
缓存的此目录项所代表的文件的 symlink_status
(std::experimental::filesystem::directory_entry 的公开成员函数)