file_status status(const path& p);
Effects: Будто:
error_code ec;
file_status result = status(p, ec);
if (result.type() == file_type::none)
throw filesystem_error(implementation-supplied-message, p, ec);
return result;
Throws: filesystem_error. [ Note: result значения file_status(file_type::not_found) и file_status(file_type::unknown) не считаются ошибками и не вызывают исключения. ] — end note
file_status status(const path& p, error_code& ec) noexcept;
Effects: Если возможно, определяет атрибуты файла, в который p разрешается, как если бы с помощью POSIX stat() для получения POSIX struct stat. Если во время определения атрибута API базовой файловой системы сообщает об ошибке, устанавливается, ec чтобы указать конкретную сообщенную ошибку. В противном случае ec.clear(). [ Note: Это позволяет пользователям проверять особенности основных ошибок API, даже если значение, возвращаемое функцией status() , не является file_status(file_type::none). ] — end note
Пусть prms обозначает результат (m & perms::mask), где m определяется как бы преобразованием st_mode члена полученного struct stat в тип perms.
Returns:
Если ec != error_code():
Если конкретная ошибка указывает, что p не может быть разрешена, потому что какой-то элемент пути не существует, возвращается file_status(file_type::not_found).
В противном случае, если конкретная ошибка указывает, что она p может быть устранена, но атрибуты не могут быть определены, возвращается file_status(file_type::unknown).
В противном случае возвращается file_status(file_type::none).
[ Note: Эта семантика различает то, p что известно, что не существует, p существует, но не может определить свои атрибуты, и есть ошибка, которая не позволяет даже узнать, p существует ли . Эти различия важны для некоторых случаев использования. ] — end note
Иначе,
Если атрибуты указывают на обычный файл, как если бы это было POSIX S_ISREG, возвращается file_status(file_type::regular, prms). [ Note: file_type::regular подразумевает, что соответствующие <fstream> операции будут успешными, при условии отсутствия ошибок оборудования, разрешений, доступа или гонок файловой системы. Отсутствие file_type::regular не обязательно означает, что <fstream> операции с каталогом завершатся ошибкой. ] — end note
В противном случае, если атрибуты указывают каталог, как если бы это было POSIX S_ISDIR, возвращается file_status(file_type::directory, prms). [ Note: file_type::directory подразумевает, что вызов directory_iterator(p) будет успешным. ] — end note
В противном случае, если атрибуты указывают на блокировку специального файла, как если бы это было POSIX S_ISBLK, возвращается file_status(file_type::block, prms).
В противном случае, если атрибуты указывают на символьный специальный файл, как если бы это было POSIX S_ISCHR, возвращается file_status(file_type::character, prms).
В противном случае, если атрибуты указывают на файл fifo или pipe, как если бы это был POSIX S_ISFIFO, возвращается file_status(file_type::fifo, prms).
В противном случае, если атрибуты указывают сокет, как если бы это было согласно POSIX S_ISSOCK, возвращается file_status(file_type::socket, prms).
В противном случае, если атрибуты указывают тип файла, определенный реализацией ([fs.enum.file_type]), возвращается file_status(file_type::A, prms), где A - константа для типа файла, определенного реализацией.
В противном случае возвращается file_status(file_type::unknown, prms).