30 Input/output library [input.output]

30.10 File systems [filesystems]

30.10.34 Filesystem operation functions [fs.op.funcs]

30.10.34.35 Status [fs.op.status]

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;

Returns: См. Выше.

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).

Remarks: Если во время разрешения имени пути встречается символическая ссылка, разрешение пути продолжается с использованием содержимого символической ссылки.