Namespaces
Variants

std::filesystem:: file_type

From ru.cppreference.net
Определено в заголовочном файле <filesystem>
enum class file_type {

none = /* unspecified */ ,
not_found = /* unspecified */ ,
regular = /* unspecified */ ,
directory = /* unspecified */ ,
symlink = /* unspecified */ ,
block = /* unspecified */ ,
character = /* unspecified */ ,
fifo = /* unspecified */ ,
socket = /* unspecified */ ,
unknown = /* unspecified */ ,
/* implementation-defined */

} ;
(начиная с C++17)

file_type определяет константы, которые указывают тип файла или каталога, на который ссылается путь. Значения перечислителей являются уникальными.

Константы

Перечислитель Значение
none указывает, что статус файла ещё не был оценён, или произошла ошибка при его оценке
not_found указывает, что файл не был найден (это не считается ошибкой)
regular обычный файл
directory каталог
symlink символическая ссылка
block блочное специальное устройство
character символьное специальное устройство
fifo FIFO-файл (также известный как pipe)
socket сокет-файл
unknown файл существует, но его тип не может быть определён
implementation-defined дополнительные константы, определённые реализацией, для каждого дополнительного типа файлов, поддерживаемого реализацией (например, MSVC STL определяет junction для NTFS junction points )

Пример

#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::тип_файла::none:
            std::cout << " имеет тип `not-evaluated-yet`";
            break;
        case fs::тип_файла::не_найдено:
            std::cout << " не существует";
            break;
        case fs::тип_файла::регулярный:
            std::cout << " является обычным файлом";
            break;
        case fs::тип_файла::директория:
            std::cout << " является каталогом";
            break;
        case fs::тип_файла::символическая ссылка:
            std::cout << " является символической ссылкой";
            break;
        case fs::тип_файла::блок:
            std::cout << " является блочным устройством";
            break;
        case fs::тип_файла::символ:
            std::cout << " является символьным устройством";
            break;
        case fs::тип_файла::fifo:
            std::cout << " является именованным каналом IPC";
            break;
        case fs::тип_файла::сокет:
            std::cout << " является именованным IPC сокетом";
            break;
        case fs::тип_файла::неизвестный:
            std::cout << " имеет тип `unknown`";
            break;
        default:
            std::cout << " имеет тип `implementation-defined`";
            break;
    }
    std::cout << '\n';
}
int main()
{
    // создание файлов различных типов
    fs::create_directory("песочница");
    fs::create_directory("песочница/дир");
    std::ofstream{"песочница/файл"}; // создать обычный файл
    fs::create_symlink("файл", "песочница/символическая ссылка");
    mkfifo("песочница/канал", 0644);
    sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    std::strcpy(addr.sun_path, "песочница/сокет");
    int fd = socket(PF_UNIX, SOCK_STREAM, 0);
    bind(fd, reinterpret_cast<sockaddr*>(&addr), sizeof addr);
    // демонстрация различных методов доступа к статусу
    for (auto it{fs::directory_iterator("песочница")}; it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // использовать кэшированный статус из записи каталога
    demo_status("/dev/null", fs::статус("/dev/null")); // прямые вызовы к статусу
    demo_status("/dev/sda", fs::статус("/dev/sda"));
    demo_status("песочница/нет", fs::статус("/песочница/нет"));
    // очистка (предпочтительнее использовать пользовательские deleter-ы на основе std::unique_ptr)
    close(fd);
    fs::remove_all("песочница");
}

Возможный вывод:

"sandbox/file" является обычным файлом
"sandbox/dir" является директорией
"sandbox/pipe" является именованным IPC-каналом
"sandbox/sock" является именованным IPC-сокетом
"sandbox/symlink" является символьной ссылкой
"/dev/null" является символьным устройством
"/dev/sda" является блочным устройством
"sandbox/no" не существует

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

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