Spec-Zone.ru › C++

std::filesystem::file_type

Определено в заголовочном файле <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 (также известный как канал)
socket файл сокета
unknown файл существует, но его тип не удалось определить
определяется реализацией дополнительная константа, определяемая реализацией, для каждого дополнительного типа файла, поддерживаемого реализацией (например, MSVC STL определяет junction для точек соединения NTFS)

Пример

#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::none:
            std::cout << " has `not-evaluated-yet` type";
            break;
        case fs::file_type::not_found:
            std::cout << " does not exist";
            break;
        case fs::file_type::regular:
            std::cout << " is a regular file";
            break;
        case fs::file_type::directory:
            std::cout << " is a directory";
            break;
        case fs::file_type::symlink:
            std::cout << " is a symlink";
            break;
        case fs::file_type::block:
            std::cout << " is a block device";
            break;
        case fs::file_type::character:
            std::cout << " is a character device";
            break;
        case fs::file_type::fifo:
            std::cout << " is a named IPC pipe";
            break;
        case fs::file_type::socket:
            std::cout << " is a named IPC socket";
            break;
        case fs::file_type::unknown:
            std::cout << " has `unknown` type";
            break;
        default:
            std::cout << " has `implementation-defined` type";
            break;
    }
    std::cout << '\n';
}

int main()
{
    // create files of different kinds
    fs::create_directory("sandbox");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/file"}; // create regular 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);

    // 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 (prefer std::unique_ptr-based custom deleters)
    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

См. также

file_status
(C++17)
представляет тип файла и разрешения
(класс)
is_block_file
(C++17)
проверяет, ссылается ли указанный путь на блочное устройство
(функция)
is_character_file
(C++17)
проверяет, ссылается ли указанный путь на символьное устройство
(функция)
is_directory
(C++17)
проверяет, ссылается ли указанный путь на каталог
(функция)
is_fifo
(C++17)
проверяет, ссылается ли указанный путь на именованный канал
(функция)
is_other
(C++17)
проверяет, ссылается ли аргумент на файл другого типа
(функция)
is_socket
(C++17)
проверяет, ссылается ли аргумент на именованный сокет IPC
(функция)
is_symlink
(C++17)
проверяет, ссылается ли аргумент на символическую ссылку
(функция)
is_regular_file
проверяет, ссылается ли запись каталога на обычный файл
(открытая функция-член std::filesystem::directory_entry)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/file_type

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API