Namespaces
Variants

std::filesystem:: is_fifo

From cppreference.net
Определено в заголовке <filesystem>
bool is_fifo ( std:: filesystem :: file_status s ) noexcept ;
(1) (начиная с C++17)
bool is_fifo ( const std:: filesystem :: path & p ) ;
(2) (начиная с C++17)
bool is_fifo ( const std:: filesystem :: path & p, std:: error_code & ec ) noexcept ;
(3) (начиная с C++17)

Проверяет, соответствует ли данный статус файла или пути файлу типа FIFO или каналу, как если бы это определялось POSIX S_ISFIFO .

1) Эквивалентно s. type ( ) == file_type :: fifo .
2,3) Эквивалентно is_fifo ( status ( p ) ) или is_fifo ( status ( p, ec ) ) соответственно.

Содержание

Параметры

s - статус файла для проверки
p - путь для запроса
ec - код ошибки для изменения в случае ошибок

Возвращаемое значение

true если файл, указанный в p или тип, указанный в s является FIFO-каналом, false в противном случае. Перегрузка без генерации исключений возвращает false при возникновении ошибки.

Исключения

Любая перегрузка, не помеченная noexcept , может выбрасывать std::bad_alloc при неудачном выделении памяти.

2,3) Устанавливает параметр std:: error_code & в код ошибки API операционной системы при сбое вызова API ОС, и выполняет ec. clear ( ) если ошибок не возникает.

Пример

#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 << " является обычным файлом\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");
    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" является обычным файлом
"sandbox/dir" является директорией
"sandbox/pipe" является именованным IPC-каналом
"sandbox/sock" является именованным IPC-сокетом
"sandbox/symlink" является символьной ссылкой
"/dev/null" является символьным устройством
"/dev/sda" является блочным устройством
"sandbox/no" не существует

Смотрите также

(C++17) (C++17)
определяет атрибуты файла
определяет атрибуты файла, проверяя цель символической ссылки
(функция)
представляет тип файла и права доступа
(класс)
проверяет, известен ли статус файла
(функция)
проверяет, ссылается ли данный путь на блочное устройство
(функция)
проверяет, ссылается ли данный путь на символьное устройство
(функция)
проверяет, ссылается ли данный путь на директорию
(функция)
(C++17)
проверяет, ссылается ли аргумент на другой файл
(функция)
проверяет, ссылается ли аргумент на обычный файл
(функция)
(C++17)
проверяет, ссылается ли аргумент на именованный IPC-сокет
(функция)
(C++17)
проверяет, ссылается ли аргумент на символическую ссылку
(функция)
(C++17)
проверяет, ссылается ли путь на существующий объект файловой системы
(функция)
проверяет, ссылается ли запись директории на именованный канал
(публичная функция-член std::filesystem::directory_entry )