Namespaces
Variants

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

From cppreference.net
Определено в заголовке <experimental/filesystem>
file_status status ( const path & p ) ;
file_status status ( const path & p, error_code & ec ) noexcept ;
(1) (filesystem TS)
file_status symlink_status ( const path & p ) ;
file_status symlink_status ( const path & p, error_code & ec ) noexcept ;
(2) (filesystem TS)
1) Определяет тип и атрибуты объекта файловой системы, идентифицируемого p как при помощи POSIX stat (символические ссылки разыменовываются до их целей).
  • Если p является обычным файлом, возвращает file_status ( file_type :: regular ) .
  • Если p является каталогом, возвращает file_status ( file_type :: directory ) .
  • Если p является блочным специальным файлом, возвращает file_status ( file_type :: block ) .
  • Если p является символьным специальным файлом, возвращает file_status ( file_type :: character ) .
  • Если p является файлом fifo или pipe, возвращает file_status ( file_type :: fifo ) .
  • Если p является сокетом, возвращает file_status ( file_type :: socket ) .
  • Если 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 ) .
2) То же, что и (1) за исключением того, что поведение аналогично использованию POSIX-функции lstat (символические ссылки не отслеживаются):
  • Если p является символической ссылкой, возвращает file_status ( file_type :: symlink ) .

Содержание

Параметры

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

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

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

Исключения

The overload that does not take an error_code & parameter throws filesystem_error on underlying OS API errors, constructed with p as the first argument and the OS error code as the error code argument. std:: bad_alloc may be thrown if memory allocation fails. The overload taking an error_code & parameter sets it to the OS API error code if an OS API call fails, and executes ec. clear ( ) if no errors occur. This overload has
noexcept спецификация:
noexcept

Примечания

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

Пример

#include <cstdio>
#include <cstring>
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::experimental::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 << " is a regular file\n";
    if (fs::is_directory(s))
        std::cout << " is a directory\n";
    if (fs::is_block_file(s))
        std::cout << " is a block device\n";
    if (fs::is_character_file(s))
        std::cout << " is a character device\n";
    if (fs::is_fifo(s))
        std::cout << " is a named IPC pipe\n";
    if (fs::is_socket(s))
        std::cout << " is a named IPC socket\n";
    if (fs::is_symlink(s))
        std::cout << " is a symlink\n";
    if (!fs::exists(s))
        std::cout << " does not exist\n";
}
int main()
{
    // создание файлов различных типов
    fs::create_directory("sandbox");
    std::ofstream("sandbox/file"); // создание обычного файла
    fs::create_directory("sandbox/dir");
    mkfifo("sandbox/pipe", 0644);
    struct 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, (struct sockaddr*)&addr, sizeof addr);
    fs::create_symlink("file", "sandbox/symlink");
    // демонстрация различных методов доступа к статусу
    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"));
    // очистка
    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

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

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