30 Input/output library [input.output]

30.10 File systems [filesystems]

30.10.34 Filesystem operation functions [fs.op.funcs]

Функции работы с файловой системой запрашивают или изменяют файлы, включая каталоги, во внешнем хранилище.

[ Note: Поскольку file system racesпри операциях файловой системы часто возникают сбои оборудования, сбои сети и многие другие виды ошибок, пользователи должны знать, что любая функция операции с файловой системой, независимо от того, насколько она кажется безобидной, может столкнуться с ошибкой; см [fs.err.report]. ] end note

30.10.34.1 Absolute [fs.op.absolute]

path absolute(const path& p); path absolute(const path& p, error_code& ec);

Effects: Создает абсолютный путь, ссылающийся на то же расположение файловой системы, что p и в операционной системе ([fs.conform.os]).

Returns: Сложенный путь. Подпись с аргументом ec возвращается, path() если возникает ошибка.

[ Note: Для возвращаемого пути, rp, rp.is_­absolute() является , true если не возникает ошибка. ]end note

Throws: Как указано в [fs.err.report].

[ Note: Чтобы разрешить символические ссылки или выполнить другую очистку, которая может потребовать запросов к вторичному хранилищу, например жестким дискам, рассмотреть canonical ([fs.op.canonical]). ]end note

[ Note: Реализациям настоятельно рекомендуется не запрашивать вторичное хранилище и не рассматривать !exists(p) ошибку. ]end note

[ Example: Для операционных систем на базе POSIX absolute(p) это просто current_­path()/p. Для операционных систем на базе Windows absolute может иметь ту же семантику, что и GetFullPathNameW. ] end example

30.10.34.2 Canonical [fs.op.canonical]

path canonical(const path& p, const path& base = current_path()); path canonical(const path& p, error_code& ec); path canonical(const path& p, const path& base, error_code& ec);

Effects: Преобразует p, который должен существовать, в абсолютный путь без символической ссылки dotили dot-dot элементов в имени пути в универсальном формате.

Returns: Путь, который относится к тому же объекту файловой системы, что и absolute(p, base). Для перегрузки без base аргумента base есть current_­path(). Подписи с аргументом ec возвращаются в path() случае ошибки.

Throws: Как указано в [fs.err.report].

Remarks: !exists(p) это ошибка.

30.10.34.3 Copy [fs.op.copy]

void copy(const path& from, const path& to);

Effects: Эквивалентно copy(from, to, copy_­options​::​none).

void copy(const path& from, const path& to, error_code& ec) noexcept;

Effects: Эквивалентно copy(from, to, copy_­options​::​none, ec).

void copy(const path& from, const path& to, copy_options options); void copy(const path& from, const path& to, copy_options options, error_code& ec) noexcept;

Requires: [fs.enum.copy.opts]Устанавливается не более одного элемента из каждой группы опций ( ) options.

Effects: Перед первым применением f и t:

  • Если

    (options & copy_options::create_symlinks) != copy_options::none ||
    (options & copy_options::skip_symlinks) != copy_options::none

    тогда auto f = symlink_­status(from) и при необходимости auto t = symlink_­status(to).

  • В противном случае, если

    (options & copy_options::copy_symlinks) != copy_options::none

    тогда auto f = symlink_­status(from) и при необходимости auto t = status(to).

  • В противном случае auto f = status(from) и при необходимости auto t = status(to).

Эффекты тогда следующие:

  • Если f.type() или t.type() является типом файла, определяемым реализацией ([fs.enum.file_type]), то эффекты определяются реализацией.

  • В противном случае сообщается об ошибке, как указано в [fs.err.report] if:

    • !exists(f), или

    • equivalent(from, to), или

    • is_­other(f) || is_­other(t), или

    • is_­directory(f) && is_­regular_­file(t).

  • В противном случае, если is_­symlink(f), то:

    • Если (options & copy_­options​::​skip_­symlinks) != copy_­options​::​none потом вернемся.

    • В противном случае, если

      !exists(t) && (options & copy_options::copy_symlinks) != copy_options::none

      тогда copy_­symlink(from, to).

    • В противном случае сообщите об ошибке, как указано в [fs.err.report].

  • В противном случае, если is_­regular_­file(f), то:

    • Если (options & copy_­options​::​directories_­only) != copy_­options​::​none, то вернись.

    • В противном случае, если (options & copy_­options​::​create_­symlinks) != copy_­options​::​none, то создайте символическую ссылку на исходный файл.

    • В противном случае, если (options & copy_­options​::​create_­hard_­links) != copy_­options​::​none, то создайте жесткую ссылку на исходный файл.

    • Иначе если is_­directory(t), то copy_­file(from, to/from.filename(), options).

    • В противном случае copy_­file(from, to, options).

  • В противном случае, если

    is_directory(f) &&
    ((options & copy_options::recursive) != copy_options::none ||
     options == copy_options::none)

    тогда:

    • Если !exists(t), то create_­directory(to, from).

    • Затем перейдите по файлам from, как если бы

      for (const directory_entry& x : directory_iterator(from))
        copy(x.path(), to/x.path().filename(), options | copy_options::unspecified)
  • В противном случае, для подписи с аргументом ec, ec.clear().

  • В остальном никаких эффектов.

Throws: Как указано в [fs.err.report].

Remarks: Для подписи с аргументом ecлюбые библиотечные функции, вызываемые реализацией, должны иметь error_­code аргумент, если это применимо.

[ Example: Учитывая эту структуру каталогов:

/dir1
  file1
  file2
  dir2
    file3

Вызов copy("/dir1", "/dir3") приведет к:

/dir1
  file1
  file2
  dir2
    file3
/dir3
  file1
  file2

В качестве альтернативы вызов copy("/dir1", "/dir3", copy_­options​::​recursive) может привести к:

/dir1
  file1
  file2
  dir2
    file3
/dir3
  file1
  file2
  dir2
    file3

end example]

30.10.34.4 Copy file [fs.op.copy_file]

bool copy_file(const path& from, const path& to); bool copy_file(const path& from, const path& to, error_code& ec) noexcept;

Returns: copy_­file(from, to, copy_­options​::​none) или
copy_­file(from, to, copy_­options​::​none, ec), соответственно.

Throws: Как указано в [fs.err.report].

bool copy_file(const path& from, const path& to, copy_options options); bool copy_file(const path& from, const path& to, copy_options options, error_code& ec) noexcept;

Requires: [fs.enum.copy.opts]Устанавливается не более одного элемента из каждой группы опций ( ) options.

Effects: Следующее:

  • Сообщить об ошибке, что файл уже существует, [fs.err.report] если:

    • !is_­regular_­file(from), или

    • exists(to) и !is_­regular_­file(to), или

    • exists(to) и equivalent(from, to), или

    • exists(to) а также

      (options & (copy_options::skip_existing |
                  copy_options::overwrite_existing |
                  copy_options::update_existing)) == copy_options::none
  • В противном случае скопируйте содержимое и атрибуты файла, в который from разрешается, в файл, в который to разрешается, если:

    • !exists(to), или

    • (options & copy_­options​::​overwrite_­existing) != copy_­options​::​none, или

    • (options & copy_­options​::​update_­existing) != copy_­options​::​none и from является более поздним, чем toопределяется, как если бы с использованием last_­write_­time функции ([fs.op.last_write_time]).

  • В остальном никаких эффектов.

Returns: true если from файл был скопирован, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

Complexity: Максимум один прямой или косвенный вызов status(to).

30.10.34.6 Create directories [fs.op.create_directories]

bool create_directories(const path& p); bool create_directories(const path& p, error_code& ec) noexcept;

Effects: Устанавливает постусловие, вызывая несуществующий create_­directory() элемент p .

Postconditions: is_­directory(p).

Returns: true если был создан новый каталог, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

Complexity: O(n) где n - количество элементов p , которых не существует.

30.10.34.7 Create directory [fs.op.create_directory]

bool create_directory(const path& p); bool create_directory(const path& p, error_code& ec) noexcept;

Effects: Устанавливает постусловие, пытаясь создать каталог, в который p разрешается, как если бы POSIX mkdir() со вторым аргументом static_­cast<int>(perms​::​all). Ошибка создания из- p за преобразования в существующий каталог не должна рассматриваться как ошибка.

Postconditions: is_­directory(p).

Returns: true если был создан новый каталог, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

bool create_directory(const path& p, const path& existing_p); bool create_directory(const path& p, const path& existing_p, error_code& ec) noexcept;

Effects: Устанавливает постусловие, пытаясь создать каталог, в который p разрешается, с атрибутами, скопированными из каталога existing_­p. Набор копируемых атрибутов зависит от операционной системы. Ошибка создания из- p за преобразования в существующий каталог не должна рассматриваться как ошибка. [ Note: Для операционных систем на базе POSIX это те атрибуты, которые копируются собственным API, stat(existing_­p.c_­str(), &attributes_­stat) за которыми следует mkdir(p.c_­str(), attributes_­stat.st_­mode). Для операционных систем на базе Windows атрибуты копируются собственным API CreateDirectoryExW(existing_­p.c_­str(), p.c_­str(), 0). ]end note

Postconditions: is_­directory(p).

Returns: true если был создан новый каталог, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.8 Create directory symlink [fs.op.create_dir_symlk]

void create_directory_symlink(const path& to, const path& new_symlink); void create_directory_symlink(const path& to, const path& new_symlink, error_code& ec) noexcept;

Effects: Устанавливает постусловие, как если бы POSIX symlink().

Postconditions: new_­symlink преобразуется в файл символьной ссылки, который содержит неопределенное представление to.

Throws: Как указано в [fs.err.report].

[ Note: Некоторые операционные системы требуют создания символической ссылки, чтобы идентифицировать ссылку на каталог. Переносимый код следует использовать create_­directory_­symlink() для создания символических ссылок на каталоги, а не ] create_­symlink() end note

[ Note: Некоторые операционные системы вообще не поддерживают символические ссылки или поддерживают их только для обычных файлов. Некоторые файловые системы (например, файловая система FAT) не поддерживают символические ссылки независимо от операционной системы. ] end note

30.10.34.9 Create hard link [fs.op.create_hard_lk]

void create_hard_link(const path& to, const path& new_hard_link); void create_hard_link(const path& to, const path& new_hard_link, error_code& ec) noexcept;

Effects: Устанавливает постусловие, как если бы POSIX link().

Postconditions:

  • exists(to) && exists(new_­hard_­link) && equivalent(to, new_­hard_­link)

  • Содержимое файла или каталога, в который to разрешается, не изменяется.

Throws: Как указано в [fs.err.report].

[ Note: Некоторые операционные системы вообще не поддерживают жесткие ссылки или поддерживают их только для обычных файлов. Некоторые файловые системы (например, файловая система FAT) не поддерживают жесткие ссылки независимо от операционной системы. Некоторые файловые системы ограничивают количество ссылок на файл. ] end note

30.10.34.11 Current path [fs.op.current_path]

path current_path(); path current_path(error_code& ec);

Returns: Абсолютный путь к текущему рабочему каталогу, имя которого в собственном формате получается, как если бы POSIX getcwd(). Подпись с аргументом ec возвращается, path() если возникает ошибка.

Throws: Как указано в [fs.err.report].

Remarks: Текущий рабочий каталог - это каталог, связанный с процессом, который используется в качестве начального местоположения при разрешении путей для относительных путей.

[ Название было выбрано , чтобы подчеркнуть , что возвращаемое значение представляет собой путь, а не только одно имя каталога. ]Note: current_­path() end note

[ Note: Текущий путь, возвращаемый многими операционными системами, является опасной глобальной переменной. Он может быть неожиданно изменен сторонними функциями, функциями системной библиотеки или другим потоком. ] end note

void current_path(const path& p); void current_path(const path& p, error_code& ec) noexcept;

Effects: Устанавливает постусловие, как если бы POSIX chdir().

Postconditions: equivalent(p, current_­path()).

Throws: Как указано в [fs.err.report].

[ Note: Текущий путь для многих операционных систем - опасное глобальное состояние. Он может быть неожиданно изменен сторонними функциями, функциями системной библиотеки или другим потоком. ] end note

30.10.34.12 Equivalent [fs.op.equivalent]

bool equivalent(const path& p1, const path& p2); bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept;

Позвольте s1 и s2 быть file_­statuss, как если бы, status(p1) и status(p2), соответственно.

Effects: Определяет s1 и s2. Если (!exists(s1) && !exists(s2)) || (is_­other(s1) && is_­other(s2)) сообщается об ошибке ([fs.err.report]).

Returns: true, если s1 == s2 и p1 и p2 разрешаются в один и тот же объект файловой системы, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.

Считается, что два пути разрешаются к одному и тому же объекту файловой системы, если два объекта-кандидата находятся на одном устройстве в одном месте. Это определяется, как если бы, значениями stat структуры POSIX , полученными, как если бы, stat() для двух путей, имеющих равные st_­dev значения и равные st_­ino значения.

Throws: Как указано в [fs.err.report].

30.10.34.13 Exists [fs.op.exists]

bool exists(file_status s) noexcept;

Returns: status_­known(s) && s.type() != file_­type​::​not_­found.

bool exists(const path& p); bool exists(const path& p, error_code& ec) noexcept;

Позвольте s быть a file_­status, определяемым, как если бы по status(p) или status(p, ec), соответственно.

Effects: Подпись с аргументом ec вызывает ec.clear() if status_­known(s).

Returns: exists(s).

Throws: Как указано в [fs.err.report].

30.10.34.14 File size [fs.op.file_size]

uintmax_t file_size(const path& p); uintmax_t file_size(const path& p, error_code& ec) noexcept;

Returns:

  • Если !exists(p) сообщается об ошибке ([fs.err.report]).

  • В противном случае, если is_­regular_­file(p), размер файла в байтах p преобразуется в, определяемый, как если бы, значением элемента stat структуры POSIX, st_­size полученным, как если бы POSIX stat().

  • В противном случае результат определяется реализацией.

Подпись с аргументом ec возвращается, static_­cast<uintmax_­t>(-1) если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.15 Hard link count [fs.op.hard_lk_ct]

uintmax_t hard_link_count(const path& p); uintmax_t hard_link_count(const path& p, error_code& ec) noexcept;

Returns: Количество жестких ссылок для p. Подпись с аргументом ec возвращается, static_­cast<uintmax_­t>(-1) если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.16 Is block file [fs.op.is_block_file]

bool is_block_file(file_status s) noexcept;

Returns: s.type() == file_­type​::​block.

bool is_block_file(const path& p); bool is_block_file(const path& p, error_code& ec) noexcept;

Returns: is_­block_­file(status(p)) или is_­block_­file(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.17 Is character file [fs.op.is_char_file]

bool is_character_file(file_status s) noexcept;

Returns: s.type() == file_­type​::​character.

bool is_character_file(const path& p); bool is_character_file(const path& p, error_code& ec) noexcept;

Returns: is_­character_­file(status(p)) или is_­character_­file(status(p, ec)), соответственно.
Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.18 Is directory [fs.op.is_directory]

bool is_directory(file_status s) noexcept;

Returns: s.type() == file_­type​::​directory.

bool is_directory(const path& p); bool is_directory(const path& p, error_code& ec) noexcept;

Returns: is_­directory(status(p)) или is_­directory(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.19 Is empty [fs.op.is_empty]

bool is_empty(const path& p); bool is_empty(const path& p, error_code& ec) noexcept;

Effects:

  • Определяем file_­status s, как будто по status(p) или status(p, ec), соответственно.

  • Для подписи с аргументом ecвернуть, false если произошла ошибка.

  • В противном случае, если is_­directory(s):

    • Создайте переменную itr, как будто по directory_­iterator itr(p) или directory_­iterator itr(p, ec), соответственно.

    • Для подписи с аргументом ecвернуть, false если произошла ошибка.

    • В противном случае верните itr == directory_­iterator().

  • Иначе:

    • Определяем uintmax_­t sz, как будто по file_­size(p) или file_­size(p, ec), соответственно.

    • Для подписи с аргументом ecвернуть, false если произошла ошибка.

    • В противном случае верните sz == 0.

Throws: Как указано в [fs.err.report].

30.10.34.20 Is fifo [fs.op.is_fifo]

bool is_fifo(file_status s) noexcept;

Returns: s.type() == file_­type​::​fifo.

bool is_fifo(const path& p); bool is_fifo(const path& p, error_code& ec) noexcept;

Returns: is_­fifo(status(p)) или is_­fifo(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.21 Is other [fs.op.is_other]

bool is_other(file_status s) noexcept;

Returns: exists(s) && !is_­regular_­file(s) && !is_­directory(s) && !is_­symlink(s).

bool is_other(const path& p); bool is_other(const path& p, error_code& ec) noexcept;

Returns: is_­other(status(p)) или is_­other(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.22 Is regular file [fs.op.is_regular_file]

bool is_regular_file(file_status s) noexcept;

Returns: s.type() == file_­type​::​regular.

bool is_regular_file(const path& p);

Returns: is_­regular_­file(status(p)).

Throws: filesystem_­error если status(p) бы бросил filesystem_­error.

bool is_regular_file(const path& p, error_code& ec) noexcept;

Effects: Устанавливает ec как бы мимо status(p, ec). [ Note: file_­type​::​none, file_­type​::​not_­found и для file_­type​::​unknown случаев установлены ec значения ошибок. Чтобы различать случаи, вызовите status функцию напрямую. ] end note

Returns: is_­regular_­file(status(p, ec)). Возвращает, false если возникает ошибка.

30.10.34.23 Is socket [fs.op.is_socket]

bool is_socket(file_status s) noexcept;

Returns: s.type() == file_­type​::​socket.

bool is_socket(const path& p); bool is_socket(const path& p, error_code& ec) noexcept;

Returns: is_­socket(status(p)) или is_­socket(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.25 Last write time [fs.op.last_write_time]

file_time_type last_write_time(const path& p); file_time_type last_write_time(const path& p, error_code& ec) noexcept;

Returns: Время последней модификации данных p, определяемое, как если бы, значением stat члена структуры POSIX, st_­mtime полученным, как если бы POSIX stat(). Подпись с аргументом ec возвращается, file_­time_­type​::​min() если возникает ошибка.

Throws: Как указано в [fs.err.report].

void last_write_time(const path& p, file_time_type new_time); void last_write_time(const path& p, file_time_type new_time, error_code& ec) noexcept;

Effects: Устанавливает время последнего изменения данных файла, разрешенного с помощью p to new_­time, как если бы POSIX futimens().

Throws: Как указано в [fs.err.report].

[ Note: Постусловие last_­write_­time(p) == new_­time не указано, поскольку оно может не выполняться для файловых систем с грубой детализацией по времени. ] end note

30.10.34.26 Permissions [fs.op.permissions]

void permissions(const path& p, perms prms, perm_options opts=perm_options::replace); void permissions(const path& p, perms prms, error_code& ec) noexcept; void permissions(const path& p, perms prms, perm_options opts, error_code& ec);

Requires: Именно одна из perm_­options констант replace, addили remove присутствует в opts.

Remarks: Вторая подпись ведет себя так, как если бы у нее был дополнительный параметр perm_­options opts с аргументом perm_­options​::​replace.

Effects: Применяет действие, указанное в, opts к p разрешению файла или к p самому файлу , если p это символическая ссылка и perm_­options​::​nofollow установлена ​​в opts. Действие применяется, как если бы POSIX fchmodat().

[ Note: Концептуально разрешения рассматриваются как биты, но фактическая реализация может использовать какой-то другой механизм. ] end note

Throws: Как указано в [fs.err.report].

30.10.34.27 Proximate [fs.op.proximate]

path proximate(const path& p, error_code& ec);

Returns: proximate(p, current_­path(), ec).

Throws: Как указано в [fs.err.report].

path proximate(const path& p, const path& base = current_path()); path proximate(const path& p, const path& base, error_code& ec);

Returns: Для первой формы:

weakly_canonical(p).lexically_proximate(weakly_canonical(base));

Для второй формы:

weakly_canonical(p, ec).lexically_proximate(weakly_canonical(base, ec));

или path() при первом возникновении ошибки, если таковая имеется.

Throws: Как указано в [fs.err.report].

30.10.34.29 Relative [fs.op.relative]

path relative(const path& p, error_code& ec);

Returns: relative(p, current_­path(), ec).

Throws: Как указано в [fs.err.report].

path relative(const path& p, const path& base = current_path()); path relative(const path& p, const path& base, error_code& ec);

Returns: Для первой формы:

weakly_canonical(p).lexically_relative(weakly_canonical(base));

Для второй формы:

weakly_canonical(p, ec).lexically_relative(weakly_canonical(base, ec));

или path() при первом возникновении ошибки, если таковая имеется.

Throws: Как указано в [fs.err.report].

30.10.34.30 Remove [fs.op.remove]

bool remove(const path& p); bool remove(const path& p, error_code& ec) noexcept;

Effects: Если exists(symlink_­status(p, ec)), файл p удаляется, как если бы POSIX remove(). [ Note: Символическая ссылка удаляется сама по себе, а не файл, в который она разрешается. ] end note

Postconditions: !exists(symlink_­status(p)).

Returns: false если p не существовало, иначе true. Подпись с аргументом ec возвращается, false если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.31 Remove all [fs.op.remove_all]

uintmax_t remove_all(const path& p); uintmax_t remove_all(const path& p, error_code& ec) noexcept;

Effects: Рекурсивно удаляет содержимое, p если оно существует, затем удаляет p сам файл , как если бы это было POSIX remove(). [ Note: Символическая ссылка удаляется сама по себе, а не файл, в который она разрешается. ] end note

Postconditions: !exists(symlink_­status(p)).

Returns: Количество удаленных файлов. Подпись с аргументом ec возвращается, static_­cast< uintmax_­t>(-1) если возникает ошибка.

Throws: Как указано в [fs.err.report].

30.10.34.32 Rename [fs.op.rename]

void rename(const path& old_p, const path& new_p); void rename(const path& old_p, const path& new_p, error_code& ec) noexcept;

Effects: Переименовывает old_­p в new_­p, как если бы POSIX rename().

[Note:

  • Если old_­p и new_­p разрешаются в один и тот же существующий файл, никаких действий не предпринимается.

  • В противном случае переименование может включать следующие эффекты:

    • если new_­p разрешается в существующий файл, не new_­p являющийся каталогом, удаляется; иначе,

    • если new_­p разрешается в существующий каталог, new_­p удаляется, если он пуст в POSIX-совместимых операционных системах, но может быть ошибкой в ​​других операционных системах.

Сама символическая ссылка переименовывается, а не файл, в который она разрешается. ]end note

Throws: Как указано в [fs.err.report].

30.10.34.33 Resize file [fs.op.resize_file]

void resize_file(const path& p, uintmax_t new_size); void resize_file(const path& p, uintmax_t new_size, error_code& ec) noexcept;

Postconditions: file_­size(p) == new_­size.

Throws: Как указано в [fs.err.report].

Remarks: Выполняет свои постусловия, как если бы это было POSIX truncate().

30.10.34.34 Space [fs.op.space]

space_info space(const path& p); space_info space(const path& p, error_code& ec) noexcept;

Returns: Тип объекта space_­info. Значение space_­info объекта определяется как если при использовании POSIX statvfs для получения POSIX struct statvfs, а затем умножения его f_­blocks, f_­bfreeи f_­bavail членов его f_­frsize членами, и присвоения результатов к capacity, freeи available членов соответственно. Любые элементы, для которых невозможно определить значение, должны быть установлены в static_­cast<uintmax_­t>(-1). Для подписи с аргументом ecвсе члены устанавливаются в значение, static_­cast<uintmax_­t>(-1) если возникает ошибка.

Throws: Как указано в [fs.err.report].

Remarks: Значение члена space_­info​::​available зависит от операционной системы. [ Note: available может быть меньше чем free. ] end note

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: Если во время разрешения имени пути встречается символическая ссылка, разрешение пути продолжается с использованием содержимого символической ссылки.

30.10.34.36 Status known [fs.op.status_known]

bool status_known(file_status s) noexcept;

Returns: s.type() != file_­type​::​none.

30.10.34.38 Temporary directory path [fs.op.temp_dir_path]

path temp_directory_path(); path temp_directory_path(error_code& ec);

Returns: Неуказанный путь к каталогу, подходящий для временных файлов. Об ошибке должно быть сообщено, если !exists(p) || !is_­directory(p), где p - путь, который должен быть возвращен. Подпись с аргументом ec возвращается, path() если возникает ошибка.

Throws: Как указано в [fs.err.report].

[ Example: Для POSIX на основе операционных систем, реализация может вернуть путь , поставляемый по первой переменной окружения , найденной в списке TMPDIR, TMP, TEMP, TEMPDIR, или если ни один из них не будут найдены, "/tmp".

Для операционных систем на базе Windows реализация может возвращать путь, указанный GetTempPath функцией Windows API. ] end example

30.10.34.39 Weakly canonical [fs.op.weakly_canonical]

path weakly_canonical(const path& p); path weakly_canonical(const path& p, error_code& ec);

Returns: p с разрешенными символическими ссылками и результатом normalized.

Effects: Используя status(p) или status(p, ec), соответственно, для определения существования, вернуть путь, составленный operator/= из результата вызова canonical() без base аргумента и с аргументом пути, состоящим из ведущих элементов, p которые существуют, если есть, за которыми следуют элементы, p которые не существуют, если любой. Для первой формы canonical() вызывается без error_­code аргумента. Во второй форме, canonical() вызывается с ec как error_­code аргумент, и path() возвращается на первом возникновении ошибки, если таковые имеются.

Postconditions: Возвращенный путь находится в normal form.

Remarks: Реализациям рекомендуется избегать ненужной нормализации, например, когда canonical уже была вызвана целиком p.

Throws: Как указано в [fs.err.report].