std::filesystem:: status, std::filesystem:: symlink_status
From cppreference.net
<
cpp
|
filesystem
|
Определено в заголовочном файле
<filesystem>
|
||
|
std::
filesystem
::
file_status
status
(
const
std::
filesystem
::
path
&
p
)
;
|
(1) | (начиная с C++17) |
|
std::
filesystem
::
file_status
status
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) noexcept ; |
(2) | (начиная с C++17) |
|
std::
filesystem
::
file_status
symlink_status
(
const
std::
filesystem
::
path
&
p
)
;
|
(3) | (начиная с C++17) |
|
std::
filesystem
::
file_status
symlink_status
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) noexcept ; |
(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)
|
проверяет, ссылается ли данный путь на блочное устройство
(функция) |
|
(C++17)
|
проверяет, ссылается ли данный путь на символьное устройство
(функция) |
|
(C++17)
|
проверяет, ссылается ли данный путь на директорию
(функция) |
|
(C++17)
|
проверяет, ссылается ли данный путь на именованный канал
(функция) |
|
(C++17)
|
проверяет, ссылается ли аргумент на
другой
тип файла
(функция) |
|
(C++17)
|
проверяет, ссылается ли аргумент на обычный файл
(функция) |
|
(C++17)
|
проверяет, ссылается ли аргумент на именованный IPC-сокет
(функция) |
|
(C++17)
|
проверяет, ссылается ли аргумент на символическую ссылку
(функция) |
|
(C++17)
|
проверяет, ссылается ли путь на существующий объект файловой системы
(функция) |
|
статус файла, обозначенного этой записью директории;
статус файла/символической ссылки, обозначенной этой записью директории (публичная функция-член
std::filesystem::directory_entry
)
|