Namespaces
Variants

std::filesystem:: status, std::filesystem:: symlink_status

From cppreference.net
Определено в заголовочном файле <filesystem>
(1) (начиная с C++17)
(2) (начиная с C++17)
(3) (начиная с C++17)
(4) (начиная с C++17)
1,2) Определяет тип и атрибуты объекта файловой системы, идентифицируемого p , как если бы с помощью POSIX stat (символические ссылки разыменовываются до своих целей). В следующем описании prms является результатом ( m & perms :: mask ) , где m получается как если бы взятием st_mode из POSIX struct stat и преобразованием его в тип std:: filesystem :: perms .
  • Если p является обычным файлом (как если бы через POSIX S_ISREG ), возвращает file_status ( file_type :: regular , prms ) .
  • Если p является каталогом (как если бы через POSIX S_ISDIR ), возвращает file_status ( file_type :: directory , prms ) .
  • Если p является блочным специальным файлом (как если бы через POSIX S_ISBLK ), возвращает file_status ( file_type :: block , prms ) .
  • Если p является символьным специальным файлом (как если бы через POSIX S_ISCHR ), возвращает file_status ( file_type :: character , prms ) .
  • Если p является файлом fifo или pipe (как если бы через POSIX S_ISFIFO ), возвращает file_status ( file_type :: fifo , prms ) .
  • Если p является сокетом (как если бы через POSIX S_ISSOCK ), возвращает file_status ( file_type :: socket , prms ) .
  • Если p имеет тип файла, определённый реализацией, возвращает file_status ( file_type :: A , prms ) , где A является определённой реализацией константой file_type для этого типа.
  • Если p не существует, возвращает file_status ( file_type :: not_found ) .
  • Если p существует, но атрибуты файла не могут быть определены, например из-за отсутствия разрешений, возвращает file_status ( file_type :: unknown ) .
  • Если ошибки препятствуют даже определению существования p , небросающая перегрузка устанавливает ec и возвращает file_status ( file_type :: none ) , а бросающая перегрузка выбрасывает filesystem_error .
  • В противном случае возвращает file_status ( file_type :: unknown , prms ) .
3,4) Аналогично (1,2) за исключением того, что поведение соответствует использованию POSIX-функции lstat (символические ссылки не отслеживаются):
  • Если p является символической ссылкой, возвращает file_status ( file_type :: symlink ) .

Содержание

Параметры

p - путь для проверки
ec - выходной параметр для сообщения об ошибках в непорождающей перегрузке

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

Статус файла (объект filesystem::file_status ).

Исключения

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

1,3) Выбрасывает std::filesystem::filesystem_error при ошибках базового API ОС, созданный с p в качестве первого аргумента пути и кодом ошибки ОС в качестве аргумента кода ошибки.
2,4) Устанавливает параметр std:: error_code & в код ошибки API операционной системы при сбое вызова OS API, и выполняет ec. clear ( ) если ошибок не возникает.

Примечания

Информация, предоставляемая этой функцией, обычно также доступна как побочный продукт итерации по каталогу и может быть получена с помощью функций-членов filesystem::directory_entry . Во время итерации по каталогу повторный вызов status не требуется.

Пример

#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)
проверяет, ссылается ли аргумент на именованный IPC-сокет
(функция)
(C++17)
проверяет, ссылается ли аргумент на символическую ссылку
(функция)
(C++17)
проверяет, ссылается ли путь на существующий объект файловой системы
(функция)
статус файла, обозначенного этой записью директории;
статус файла/символической ссылки, обозначенной этой записью директории
(публичная функция-член std::filesystem::directory_entry )