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

Пример

#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/w/cpp/filesystem/file_type

Spec-Zone.ru

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