30 Input/output library [input.output]

30.10 File systems [filesystems]

30.10.1 General [fs.general]

В этом подпункте описываются операции с файловыми системами и их компонентами, такими как пути, обычные файлы и каталоги.

30.10.2 Conformance [fs.conformance]

Соответствие определяется поведением. Идеальное поведение не всегда реализуемо, поэтому в подразделах о соответствии это учтено.

30.10.2.1 POSIX conformance [fs.conform.9945]

Некоторое поведение определяется ссылкой на POSIX ([fs.norm.ref]). Как на самом деле реализуется такое поведение, не уточняется. [ Note: Это составляет правило «как если бы», позволяющее реализациям вызывать собственную операционную систему или другие API. ] end note

Реализациям рекомендуется обеспечивать такое поведение, как оно определено в POSIX. Реализации должны документировать любое поведение, которое отличается от поведения, определенного POSIX. Реализациям, которые не поддерживают точное поведение POSIX, рекомендуется обеспечивать поведение, максимально приближенное к поведению POSIX, насколько это разумно с учетом ограничений реальных операционных систем и файловых систем. Если реализация не может обеспечить какое-либо разумное поведение, реализация должна сообщить об ошибке, как указано в [fs.err.report]. [ Note: Это позволяет пользователям полагаться на возникшее исключение или установленный код ошибки, когда реализация не может обеспечить какое-либо разумное поведение. ]end note

Реализации не обязаны обеспечивать поведение, которое не поддерживается конкретной файловой системой. [ Example: Файловая система FAT, используемая некоторыми картами памяти, памятью камеры и гибкими дисками, не поддерживает жесткие ссылки, символические ссылки и многие другие функции более функциональных файловых систем, поэтому не требуются реализации для поддержки этих функций в файловой системе FAT, но вместо этого требуется сообщить об ошибке, как описано выше. ]end example

30.10.2.2 Operating system dependent behavior conformance [fs.conform.os]

Некоторое поведение указывается как имеющееся operating system dependent. Операционная система, от которой зависит реализация, определяется реализацией.

Допускается, чтобы реализация зависела от эмулятора операционной системы, а не от фактической базовой операционной системы.

30.10.2.3 File system race behavior [fs.race.behavior]

Поведение не определено, если вызовы функций, предоставленные этим подпунктом, вводят file system race.

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

30.10.3 Normative references [fs.norm.ref]

В этом подпункте для демонстрации упоминаются коммерчески доступные операционные системы.328

POSIX® - зарегистрированная торговая марка IEEE. Windows® является зарегистрированным товарным знаком Microsoft Corporation. Эта информация дается для удобства пользователей этого документа и не означает одобрения этих продуктов со стороны ISO или IEC.

30.10.4 Terms and definitions [fs.definitions]

30.10.5 absolute path [fs.def.absolute.path]

Путь, который однозначно определяет местоположение файла без ссылки на дополнительное начальное местоположение. Элементы пути, определяющие, является ли он абсолютным, зависят от операционной системы.

30.10.6 directory [fs.def.directory]

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

30.10.7 file [fs.def.file]

Объект в файловой системе, содержащий пользовательские или системные данные. Файлы можно записывать, читать из них или и то, и другое. У файла есть определенные атрибуты, включая тип. Типы файлов включают обычные файлы и каталоги. Другие типы файлов, например symbolic links, могут поддерживаться реализацией.

30.10.8 file system [fs.def.filesystem]

Коллекция файлов и их атрибутов.

30.10.9 file system race [fs.def.race]

Состояние, которое возникает, когда несколько потоков, процессов или компьютеров чередуют доступ и изменение одного и того же объекта в файловой системе.

30.10.10 filename [fs.def.filename]

Имя файла. Имена файлов dot и dot-dot, состоящие только из одного и двух символов точки соответственно, имеют особое значение. Следующие характеристики имен файлов зависят от операционной системы:

  • Разрешенные символы. [ Example: Некоторые операционные системы запрещают использование управляющих символов ASCII (0x00 - 0x1F) в именах файлов. ] end example

  • Максимально допустимая длина.

  • Запрещенные имена файлов.

  • Имена файлов, имеющие особое значение.

  • Знание регистра и чувствительность при разрешении пути.

  • Специальные правила, которые могут применяться к типам файлов, отличных от обычных файлов, например к каталогам.

30.10.13 native encoding [fs.def.native.encode]

Для узких символьных строк текущая кодировка путей ([fs.def.pathname]) зависит от операционной системы . Для строк широких символов определяется реализация кодировки расширенного набора символов ([lex.charset]).

30.10.14 native pathname format [fs.def.native]

Формат пути, зависящий от операционной системы, принимаемый операционной системой хоста.

30.10.15 normal form [fs.def.normal.form]

Путь в нормальной форме называется normalized. Вызывается процесс получения нормализованного пути из пути, который не находится в нормальной форме normalization.

Нормализация имени пути общего формата означает:

  1. Если путь пуст, остановитесь.

  2. Замените каждый символ косой черты в root-nameсимволе preferred-separator.

  3. Замените каждый directory-separatorна preferred-separator. [ Note: Общая грамматика имени пути ([fs.path.generic]) определяет directory-separatorкак одну или несколько косых черт и preferred-separators. ] end note

  4. Удалите каждое dot имя файла и все сразу после него directory-separator.

  5. Если появятся какие-либо, удалите неdot-dot имя файла, за которым сразу следует имя directory-separatorи dot-dot имя файла, а также все, что непосредственно следует за ним directory-separator.

  6. Если есть root-directory, удалите все dot-dot имена файлов и все, что directory-separators сразу после них. [ Note: Эти dot-dot имена файлов пытаются ссылаться на несуществующие родительские каталоги. ] end note

  7. Если последним именем файла является dot-dot, удалите все завершающие directory-separator.

  8. Если путь пуст, добавьте dot.

30.10.16 operating system dependent behavior [fs.def.osdep]

Поведение, зависящее от поведения и характеристик операционной системы. Смотрите [fs.conform.os].

30.10.17 parent directory [fs.def.parent]

& langle; каталога & rangle; каталог, который содержит запись каталога для данного каталога и представлен именем файла dot-dot в данном каталоге.

30.10.18 parent directory [fs.def.parent.other]

& langle; других типов файлов & rangle; каталог, содержащий запись каталога для обсуждаемого файла.

30.10.19 path [fs.def.path]

Последовательность элементов, определяющих расположение файла в файловой системе. Эти элементы являются root-nameopt, root-directoryoptи необязательной последовательностью имен файлов. Максимальное количество элементов в последовательности зависит от операционной системы.

30.10.20 pathname [fs.def.pathname]

Строка символов, представляющая имя пути. Имена путей форматируются в соответствии с generic pathname format грамматикой или собственным форматом имени пути, зависящим от операционной системы.

30.10.21 pathname resolution [fs.def.pathres]

Разрешение имени пути - это зависимый от операционной системы механизм для разрешения имени пути к определенному файлу в файловой иерархии. Может быть несколько имен пути, которые разрешаются в один и тот же файл. [ Example: POSIX определяет механизм в разделе 4.11, Разрешение пути. ]end example

30.10.22 relative path [fs.def.rel.path]

Путь, который не является абсолютным и как таковой, только однозначно определяет местоположение файла при разрешении ([fs.def.pathres]) относительно предполагаемого начального местоположения. Элементы пути, определяющие, является ли он относительным, зависят от операционной системы. [ Note: Пути "." и «..» - относительные пути. ]end note

30.10.24 Requirements [fs.req]

На протяжении всего этого подпункта, char, wchar_­t, char16_­t, и char32_­t собирательно называют encoded character types.

Функции с указанными параметрами шаблона EcharT не должны участвовать в разрешении перегрузки, если EcharT это не один из типов закодированных символов.

Именованные параметры шаблона InputIterator должны соответствовать input iterator requirements и должны иметь тип значения, который является одним из типов кодированных символов.

[ Note: Использование кодированного типа символа подразумевает связанный набор символов и кодировку. Поскольку signed char и не unsigned char имеют подразумеваемого набора символов и кодировки, они не включены как разрешенные типы. ] end note

Названные параметры шаблона Allocator должны соответствовать стандарту Allocator requirements.

30.10.24.1 Namespaces and headers [fs.req.namespace]

Если не указано иное, предполагается, что ссылки на сущности, описанные в этом подпункте, дополнены ​::​std​::​filesystem​::​.

30.10.25 Header <filesystem> synopsis [fs.filesystem.syn]

namespace std::filesystem {
  // [fs.class.path], paths
  class path;

  // [fs.path.nonmember], path non-member functions
  void swap(path& lhs, path& rhs) noexcept;
  size_t hash_value(const path& p) noexcept;

  bool operator==(const path& lhs, const path& rhs) noexcept;
  bool operator!=(const path& lhs, const path& rhs) noexcept;
  bool operator< (const path& lhs, const path& rhs) noexcept;
  bool operator<=(const path& lhs, const path& rhs) noexcept;
  bool operator> (const path& lhs, const path& rhs) noexcept;
  bool operator>=(const path& lhs, const path& rhs) noexcept;

  path operator/ (const path& lhs, const path& rhs);

  // [fs.path.io], path inserter and extractor
  template <class charT, class traits>
    basic_ostream<charT, traits>&
      operator<<(basic_ostream<charT, traits>& os, const path& p);
  template <class charT, class traits>
    basic_istream<charT, traits>&
      operator>>(basic_istream<charT, traits>& is, path& p);

  // [fs.path.factory], path factory functions
  template <class Source>
    path u8path(const Source& source);
  template <class InputIterator>
    path u8path(InputIterator first, InputIterator last);

  // [fs.class.filesystem_error], filesystem errors
  class filesystem_error;

  // [fs.class.directory_entry], directory entries
  class directory_entry;

  // [fs.class.directory_iterator], directory iterators
  class directory_iterator;

  // [fs.dir.itr.nonmembers], range access for directory iterators
  directory_iterator begin(directory_iterator iter) noexcept;
  directory_iterator end(const directory_iterator&) noexcept;

  // [fs.class.rec.dir.itr], recursive directory iterators
  class recursive_directory_iterator;

  // [fs.rec.dir.itr.nonmembers], range access for recursive directory iterators
  recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
  recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;

  // [fs.class.file_status], file status
  class file_status;

  struct space_info {
    uintmax_t capacity;
    uintmax_t free;
    uintmax_t available;
  };

  // [fs.enum], enumerations
  enum class file_type;
  enum class perms;
  enum class perm_options;
  enum class copy_options;
  enum class directory_options;

  using file_time_type = chrono::time_point<trivial-clock>;

  // [fs.op.funcs], filesystem operations
  path absolute(const path& p, const path& base = current_path());

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

  void copy(const path& from, const path& to);
  void copy(const path& from, const path& to, error_code& ec) noexcept;
  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;

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

  void copy_symlink(const path& existing_symlink, const path& new_symlink);
  void copy_symlink(const path& existing_symlink, const path& new_symlink,
                    error_code& ec) noexcept;

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

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

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

  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;

  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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  bool is_symlink(file_status s) noexcept;
  bool is_symlink(const path& p);
  bool is_symlink(const path& p, error_code& ec) noexcept;

  file_time_type last_write_time(const path& p);
  file_time_type last_write_time(const path& p, error_code& ec) noexcept;
  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;

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

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

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

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

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

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

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

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

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

  file_status status(const path& p);
  file_status status(const path& p, error_code& ec) noexcept;

  bool status_known(file_status s) noexcept;

  file_status symlink_status(const path& p);
  file_status symlink_status(const path& p, error_code& ec) noexcept;

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

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

trivial-clock - это определяемый реализацией тип, который удовлетворяет требованиям TrivialClock requirements и может представлять и измерять значения времени файла. Реализации должны гарантировать, что разрешение и диапазон file_­time_­type отражают разрешение, зависящее от операционной системы, и диапазон значений времени файла.

30.10.26 Error reporting [fs.err.report]

Функции библиотеки файловой системы часто предоставляют две перегрузки: одна генерирует исключение для сообщения об ошибках файловой системы, а другая устанавливает файл error_­code. [ Note: Это поддерживает два распространенных варианта использования:

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

  • Используется там, где ошибки файловой системы являются обычными и не обязательно означают сбой. Наиболее подходящим ответом является возврат кода ошибки. Это позволяет обрабатывать ошибки приложения, в том числе просто игнорировать ошибку.

end note]

Функции, не имеющие аргумента типа, error_­code& обрабатывают ошибки следующим образом, если не указано иное:

  • Когда вызов реализацией операционной системы или другого базового API приводит к ошибке, которая не позволяет функции соответствовать ее спецификациям,filesystem_­error должно быть выброшено исключение типа . Для функций с одним аргументом пути этот аргумент должен быть передан filesystem_­error конструктору с одним аргументом пути. Для функций с двумя аргументами пути первый из этих аргументов должен быть передан filesystem_­error конструктору как path1 аргумент, а второй должен быть передан как path2 аргумент. В filesystem_­error конструкторском error_­code аргумент устанавливается в зависимости от обстоятельств зависимой ошибки конкретной операционной системы.

  • О невозможности выделить хранилище сообщается путем выдачи исключения, как описано в [res.on.exception.handling].

  • Деструкторы ничего не выкидывают.

Функции, имеющие аргумент типа, error_­code& обрабатывают ошибки следующим образом, если не указано иное:

  • Если вызов реализацией операционной системы или другого базового API приводит к ошибке, которая не позволяет функции соответствовать ее спецификациям, error_­code& аргумент устанавливается в соответствии с конкретной зависимой от операционной системы ошибкой. В противном случае clear() вызывается error_­code& аргумент.

30.10.27 Class path [fs.class.path]

Объект класса path представляет собой path и содержит pathname. Такой объект касается только лексических и синтаксических аспектов пути. Путь не обязательно существует во внешнем хранилище, и путь не обязательно действителен для текущей операционной системы или для конкретной файловой системы.

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

namespace std::filesystem {
  class path {
  public:
    using value_type  = see below;
    using string_type = basic_string<value_type>;
    static constexpr value_type preferred_separator = see below;

    // [fs.enum.path.format], enumeration format
    enum format;

    // [fs.path.construct], constructors and destructor
    path() noexcept;
    path(const path& p);
    path(path&& p) noexcept;
    path(string_type&& source, format fmt = auto_format);
    template <class Source>
      path(const Source& source, format fmt = auto_format);
    template <class InputIterator>
      path(InputIterator first, InputIterator last, format fmt = auto_format);
    template <class Source>
      path(const Source& source, const locale& loc, format fmt = auto_format);
    template <class InputIterator>
      path(InputIterator first, InputIterator last, const locale& loc, format fmt = auto_format);
    ~path();

    // [fs.path.assign], assignments
    path& operator=(const path& p);
    path& operator=(path&& p) noexcept;
    path& operator=(string_type&& source);
    path& assign(string_type&& source);
    template <class Source>
      path& operator=(const Source& source);
    template <class Source>
      path& assign(const Source& source)
    template <class InputIterator>
      path& assign(InputIterator first, InputIterator last);

    // [fs.path.append], appends
    path& operator/=(const path& p);
    template <class Source>
      path& operator/=(const Source& source);
    template <class Source>
      path& append(const Source& source);
    template <class InputIterator>
      path& append(InputIterator first, InputIterator last);

    // [fs.path.concat], concatenation
    path& operator+=(const path& x);
    path& operator+=(const string_type& x);
    path& operator+=(basic_string_view<value_type> x);
    path& operator+=(const value_type* x);
    path& operator+=(value_type x);
    template <class Source>
      path& operator+=(const Source& x);
    template <class EcharT>
      path& operator+=(EcharT x);
    template <class Source>
      path& concat(const Source& x);
    template <class InputIterator>
      path& concat(InputIterator first, InputIterator last);

    // [fs.path.modifiers], modifiers
    void  clear() noexcept;
    path& make_preferred();
    path& remove_filename();
    path& replace_filename(const path& replacement);
    path& replace_extension(const path& replacement = path());
    void  swap(path& rhs) noexcept;

    // [fs.path.native.obs], native format observers
    const string_type& native() const noexcept;
    const value_type*  c_str() const noexcept;
    operator string_type() const;

    template <class EcharT, class traits = char_traits<EcharT>,
              class Allocator = allocator<EcharT>>
      basic_string<EcharT, traits, Allocator>
        string(const Allocator& a = Allocator()) const;
    std::string    string() const;
    std::wstring   wstring() const;
    std::string    u8string() const;
    std::u16string u16string() const;
    std::u32string u32string() const;

    // [fs.path.generic.obs], generic format observers
    template <class EcharT, class traits = char_traits<EcharT>,
              class Allocator = allocator<EcharT>>
      basic_string<EcharT, traits, Allocator>
        generic_string(const Allocator& a = Allocator()) const;
    std::string    generic_string() const;
    std::wstring   generic_wstring() const;
    std::string    generic_u8string() const;
    std::u16string generic_u16string() const;
    std::u32string generic_u32string() const;

    // [fs.path.compare], compare
    int  compare(const path& p) const noexcept;
    int  compare(const string_type& s) const;
    int  compare(basic_string_view<value_type> s) const;
    int  compare(const value_type* s) const;

    // [fs.path.decompose], decomposition
    path root_name() const;
    path root_directory() const;
    path root_path() const;
    path relative_path() const;
    path parent_path() const;
    path filename() const;
    path stem() const;
    path extension() const;

    // [fs.path.query], query
    bool empty() const noexcept;
    bool has_root_name() const;
    bool has_root_directory() const;
    bool has_root_path() const;
    bool has_relative_path() const;
    bool has_parent_path() const;
    bool has_filename() const;
    bool has_stem() const;
    bool has_extension() const;
    bool is_absolute() const;
    bool is_relative() const;

    // [fs.path.gen], generation
    path lexically_normal() const;
    path lexically_relative(const path& base) const;
    path lexically_proximate(const path& base) const;

    // [fs.path.itr], iterators
    class iterator;
    using const_iterator = iterator;

    iterator begin() const;
    iterator end() const;
  };
}

value_­type - это typedef тип кодированных символов, зависящий от операционной системы, используемый для представления имен путей.

Значение preferred_­separator члена - это зависимый от операционной системы preferred-separatorсимвол ([fs.path.generic]).

[ Example: Для операционных систем на базе POSIX value_­type есть char и preferred_­separator остается косая черта ('/'). В операционных системах Windows value_­type есть wchar_­t и preferred_­separator остается символ обратной косой черты (L'\\'). ]end example

30.10.27.1 Generic pathname format [fs.path.generic]

pathname:
	root-nameopt root-directoryopt relative-path
root-name:
	operating system dependent sequences of characters
	implementation-defined sequences of characters
root-directory:
	directory-separator
relative-path:
	filename
	filename directory-separator relative-path
	an empty path
filename:
	non-empty sequence of characters other than directory-separator characters
directory-separator:
	preferred-separator directory-separatoropt
	fallback-separator directory-separatoropt
preferred-separator:
	operating system dependent directory separator character
fallback-separator:
	/, if preferred-separator is not /

[ Note: Операционные системы часто накладывают ограничения на символы, которые могут использоваться в файле filename. Для широкой переносимости пользователи могут захотеть ограничить количество filename символов набором символов переносимого имени файла POSIX: ]
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _­ - end note

За исключением a root-name, несколько следующих друг за другом directory-separatorсимволов считаются одним directory-separatorсимволом.

Имя файла dot ([fs.def.filename]) рассматривается как ссылка на текущий каталог. Имя файла dot-dot ([fs.def.filename]) рассматривается как ссылка на родительский каталог. То , что имя файл dot-dot относится к относительно root-directoryявляется реализацией. Определенные имена файлов могут иметь особое значение для конкретной операционной системы.

A root-nameопределяет начальное местоположение для разрешения имени пути ([fs.def.pathres]). Если нет зависимостей от операционной системы root-names, требуется по крайней мере одна реализация, определяемая root-name. [ Note: Многие операционные системы определяют имя, начинающееся с двух directory-separatorсимволов, как, root-nameкоторое идентифицирует расположение сети или других ресурсов. Некоторые операционные системы определяют одну букву, за которой следует двоеточие, как спецификатор диска - root-name идентифицирующий конкретное устройство, такое как диск. ]end note

Если a root-nameв остальном неоднозначно, выбирается вариант с самой длинной последовательностью символов. [ Note: В операционной системе, подобной POSIX, невозможно иметь root-nameи relative-path без промежуточных root-directoryэлементов. ]end note

30.10.27.2 path conversions [fs.path.cvt]

30.10.27.2.1 path argument format conversions [fs.path.fmt.cvt]

[ Note: Преобразования формата, описанные в этом разделе, не применяются в операционных системах на базе POSIX, потому что в этих системах:

  • Общий формат приемлем как собственный путь.

  • Нет необходимости различать собственный формат и общий формат в аргументах функции.

  • Пути к обычным файлам и пути к каталогам имеют одинаковый синтаксис.

end note]

Некоторые функции определены для приема detected-format аргументов, которые представляют собой последовательности символов. Аргумент обнаруженного формата представляет путь с использованием либо имени пути в, generic format либо имени пути в native format. Такой аргумент считается имеющимся в общем формате тогда и только тогда, когда он соответствует универсальному формату и неприемлем для операционной системы в качестве собственного пути.

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

При необходимости имена путей преобразуются между общим и собственным форматами в зависимости от операционной системы. Пусть G(n) и N(g) в математическом смысле будут функциями реализации, которые преобразуют родной формат в общий и общий в собственный формат соответственно. Если g=G(n) для некоторых n, то G(N(g))=g; если n=N(g) для некоторых g, то N(G(n))=n. [ Note: Ни и G не N должны быть обратимыми. ] end note

Если собственный формат требует, чтобы пути к обычным файлам были отформатированы иначе, чем пути к каталогам, путь должен рассматриваться как путь к каталогу, если его последний элемент - a directory-separator, в противном случае он должен рассматриваться как путь к обычному файлу.

[ Note: Путь хранит имя пути в собственном формате ([fs.path.native.obs]) и действует так, как если бы он также хранит имя пути общего формата, как указано ниже. Реализация может сгенерировать имя пути общего формата на основе имени пути в собственном формате (и, возможно, другой информации) по запросу. ]end note

Когда путь строится из или ему назначается одно представление, отдельное от любого пути, другое представление выбирается соответствующей функцией преобразования (G или N).

Когда (новое) значение p одного представления пути получается из представления того или иного пути, значение q выбирается для другого представления. Значение q преобразуется в p (по G или N в зависимости от обстоятельств), если это делает какое-либо такое значение; q иначе не указано. [ Note: Если q это результат преобразования любого пути, то это результат преобразования p. ]end note

30.10.27.2.2 path type and encoding conversions [fs.path.type.cvt]

Для аргументов функций-членов, которые принимают последовательности символов, представляющих пути, и для функций-членов, возвращающих строки, преобразование типа значения и кодировки выполняется, если тип значения аргумента или возвращаемого значения отличается от path​::​value_­type. Для аргумента или возвращаемого значения метод преобразования и кодировка, в которую нужно преобразовать, определяются его типом значения:

  • char: Кодировка является собственной узкой кодировкой ([fs.def.native.encode]). Метод преобразования, если таковой имеется, зависит от операционной системы. [ Note: Для POSIX операционных систем на основе path​::​value_­type является char поэтому не преобразование из char аргументов типа значения или char значений типа возвращаемого значения не выполняется. Для операционных систем на базе Windows собственная узкая кодировка определяется путем вызова функции Windows API. ] [ Это приводит к поведению, аналогичному поведению других стандартных библиотечных функций C и C ++, которые выполняют файловые операции с использованием узких строк символов для определения путей. Изменение такого поведения может вызвать удивление и привести к ошибкам. ] end noteNote: end note

  • wchar_­t: Кодировка native wide encoding. Метод преобразования не указан. [ Note: Для операционных систем на базе Windows не path​::​value_­type выполняется wchar_­t преобразование из wchar_­t аргументов типа значения или в wchar_­t возвращаемые значения типа значения. ] end note

  • char16_­t: Кодировка - UTF-16. Метод преобразования не указан.

  • char32_­t: Кодировка - UTF-32. Метод преобразования не указан.

Если преобразуемая кодировка не имеет представления для исходных символов, результирующие преобразованные символы, если таковые имеются, не определены. Реализации не должны изменять аргументы функций-членов, если они уже имеют тип path​::​value_­type.

30.10.27.3 path requirements [fs.path.req]

В дополнение к требованиям ([fs.req]), указанные параметры шаблона функции Source должны быть одним из следующих:

  • basic_­string<EcharT, traits, Allocator>. Аргумент функции const Source& source должен иметь эффективный диапазон [source.begin(), source.end()).

  • basic_­string_­view<EcharT, traits>. Аргумент функции const Source& source должен иметь эффективный диапазон [source.begin(), source.end()).

  • Тип, отвечающий требованиям итератора ввода, который выполняет итерацию по NTCTS. Тип значения должен быть типом закодированного символа. Аргумент функции const Source& source должен иметь эффективный диапазон, [source, end) где end - первое значение итератора со значением элемента, равным iterator_­traits<Source>​::​value_­type().

  • Символьный массив, который после преобразования массива в указатель приводит к указателю на начало NTCTS. Тип значения должен быть типом закодированного символа. Аргумент функции const Source& source должен иметь эффективный диапазон, [source, end) где end - первое значение итератора со значением элемента, равным iterator_­traits<decay_­t<Source>>​::​value_­type().

Функции, принимающие указанные параметры шаблона Source , не должны участвовать в разрешении перегрузки, если либо

  • Source является специализацией basic_­string или basic_­string_­view, или

  • qualified-id iterator_­traits<decay_­t<Source>>​::​value_­type является действительным , и обозначает , возможно , const закодированный тип символов ([temp.deduct]).

[ Note: Посмотрите, path conversions как указанные выше типы значений и их кодировки преобразуются в path​::​value_­type и его кодировку. ]end note

Аргументы типа Source не должны быть нулевыми указателями.

30.10.27.4 path members [fs.path.member]

30.10.27.4.1 path constructors [fs.path.construct]

path() noexcept;

Effects: Создает объект класса path.

Postconditions: empty() == true.

path(const path& p); path(path&& p) noexcept;

Effects: Создает объект класса, path имеющий тот же путь в собственном и универсальном форматах, соответственно, что и исходное значение p. Во второй форме p остается в допустимом, но неуказанном состоянии.

path(string_type&& source, format fmt = auto_format);

Effects: Создает объект класса, path для которого имя пути в обнаруженном формате source имеет исходное значение source ([fs.path.fmt.cvt]), преобразовывая формат, если требуется ([fs.path.fmt.cvt]). source остается в допустимом, но неуказанном состоянии.

template <class Source> path(const Source& source, format fmt = auto_format); template <class InputIterator> path(InputIterator first, InputIterator last, format fmt = auto_format);

Effects: Позвольте s быть эффективным диапазоном source ([fs.path.req]) или диапазоном [first, last)с преобразованной кодировкой, если требуется ([fs.path.cvt]). Находит обнаруженный формат s ([fs.path.fmt.cvt]) и создает объект класса, path для которого задан путь в этом формате s.

template <class Source> path(const Source& source, const locale& loc, format fmt = auto_format); template <class InputIterator> path(InputIterator first, InputIterator last, const locale& loc, format fmt = auto_format);

Requires: Тип значения Source и InputIterator есть char.

Effects: Позвольте s быть эффективным диапазоном source или диапазоном [first, last)после преобразования кодировки следующим образом:

  • Если value_­type есть wchar_­t, преобразуется в стандартную широкую кодировку ([fs.def.native.encode]) с использованием codecvt<​wchar_­t, char, mbstate_­t> аспекта loc.

  • В противном случае выполняется преобразование с использованием codecvt<wchar_­t, char, mbstate_­t> фасета loc, а затем выполняется второе преобразование в текущую узкую кодировку.

Находит обнаруженный формат s ([fs.path.fmt.cvt]) и создает объект класса, path для которого задан путь в этом формате s.

[ Example: Строка должна быть прочитана из базы данных, которая закодирована в ISO / IEC 8859-1, и использована для создания каталога:

namespace fs = std::filesystem;
std::string latin1_string = read_latin1_data();
codecvt_8859_1<wchar_t> latin1_facet;
std::locale latin1_locale(std::locale(), latin1_facet);
fs::create_directory(fs::path(latin1_string, latin1_locale));

Для операционных систем на основе POSIX путь создается путем использования сначала latin1_­facet для преобразования кодировки ISO / IEC 8859-1 latin1_­string в широкую символьную строку в собственной широкой кодировке ([fs.def.native.encode]). Полученная в результате широкая строка затем преобразуется в строку узкого символьного имени пути в текущей собственной узкой кодировке. Если собственная широкая кодировка - UTF-16 или UTF-32, а текущая собственная узкая кодировка - UTF-8, все символы в наборе символов ISO / IEC 8859-1 будут преобразованы в их представление Unicode, но для других в родных узких кодировках некоторые символы могут не иметь представления.

Для операционных систем на базе Windows путь создается с использованием latin1_­facet преобразования ISO / IEC 8859-1 latin1_­string в строку имени пути с расширенными символами в кодировке UTF-16. Все символы в наборе символов ISO / IEC 8859-1 будут преобразованы в их представление Unicode. ] end example

30.10.27.4.2 path assignments [fs.path.assign]

path& operator=(const path& p);

Effects: Если *this и p являются одним и тем же объектом, не действует. В противном случае устанавливает оба соответствующих пути *this в соответствующие пути к p.

Returns: *this.

path& operator=(path&& p) noexcept;

Effects: Если *this и p являются одним и тем же объектом, не действует. В противном случае устанавливает оба соответствующих пути *this в соответствующие пути к p. p остается в допустимом, но неуказанном состоянии. [ Note: Допустимая реализация swap(p). ] end note

Returns: *this.

path& operator=(string_type&& source); path& assign(string_type&& source);

Effects: Устанавливает имя пути в обнаруженном формате source в исходное значение source. source остается в допустимом, но неуказанном состоянии.

Returns: *this.

template <class Source> path& operator=(const Source& source); template <class Source> path& assign(const Source& source); template <class InputIterator> path& assign(InputIterator first, InputIterator last);

Effects: Позвольте s быть эффективным диапазоном source ([fs.path.req]) или диапазоном [first, last)с преобразованной кодировкой, если требуется ([fs.path.cvt]). Находит обнаруженный формат s ([fs.path.fmt.cvt]) и устанавливает путь в этом формате равным s.

Returns: *this.

30.10.27.4.3 path appends [fs.path.append]

Операции добавления используются operator/= для обозначения их семантического эффекта добавления preferred-separatorпри необходимости.

path& operator/=(const path& p);

Effects: Если p.is_­absolute() || (p.has_­root_­name() && p.root_­name() != root_­name()), то operator=(p).

В противном случае изменяется, *this как если бы эти шаги:

  • Если p.has_­root_­directory(), то удаляет любой корневой каталог и относительный путь из имени пути общего формата. В противном случае, если !has_­root_­directory() && is_­absolute() есть true или если has_­filename() есть true, то добавляется path​::​preferred_­separator к имени пути общего формата.

  • Затем добавляет путь в собственном формате p, исключая любые root-nameиз его имени пути общего формата, к имени пути в собственном формате.

[ Example: Даже если //host интерпретируются как root-name, оба пути path("//host")/"foo" и path("//host/")/"foo" равны "//host/foo".

Примеры выражений:

// On POSIX,
path("foo") / "";     // yields "foo/"
path("foo") / "/bar"; // yields "/bar"
// On Windows, backslashes replace slashes in the above yields

// On Windows,
path("foo") / "c:/bar";  // yields "c:/bar"
path("foo") / "c:";      // yields "c:"
path("c:") / "";         // yields "c:"
path("c:foo") / "/bar";  // yields "c:/bar"
path("c:foo") / "c:bar"; // yields "c:foo/bar"

end example]

Returns: *this.

template <class Source> path& operator/=(const Source& source); template <class Source> path& append(const Source& source);

Effects: Эквивалентно: return operator/=(path(source));

template <class InputIterator> path& append(InputIterator first, InputIterator last);

Effects: Эквивалентно: return operator/=(path(first, last));

30.10.27.4.4 path concatenation [fs.path.concat]

path& operator+=(const path& x); path& operator+=(const string_type& x); path& operator+=(basic_string_view<value_type> x); path& operator+=(const value_type* x); path& operator+=(value_type x); template <class Source> path& operator+=(const Source& x); template <class EcharT> path& operator+=(EcharT x); template <class Source> path& concat(const Source& x);

Effects: Добавляется path(x).native() к имени пути в собственном формате. [ Note: Это напрямую влияет на значение native() и может не переноситься между операционными системами. ]end note

Returns: *this.

template <class InputIterator> path& concat(InputIterator first, InputIterator last);

Effects: Эквивалентно return *this += path(first, last).

30.10.27.4.5 path modifiers [fs.path.modifiers]

void clear() noexcept;

Postconditions: empty() == true.

path& make_preferred();

Effects: Каждый directory-separator путь в общем формате преобразуется в preferred-separator.

Returns: *this.

[Example:

path p("foo/bar");
std::cout << p << '\n';
p.make_preferred();
std::cout << p << '\n';

В операционной системе, где preferred-separatorстоит косая черта, вывод будет следующим:

"foo/bar"
"foo/bar"

В операционной системе, где preferred-separatorиспользуется обратная косая черта, вывод будет следующим:

"foo/bar"
"foo\bar"

end example]

path& remove_filename();

Postconditions: !has_­filename().

Effects: Удалите путь filename() к общему формату из пути к общему формату.

Returns: *this.

[Example:

path("foo/bar").remove_filename(); // yields "foo/"
path("foo/").remove_filename();    // yields "foo/"
path("/foo").remove_filename();    // yields "/"
path("/").remove_filename();       // yields "/"

end example]

path& replace_filename(const path& replacement);

Effects: Эквивалентно:

remove_filename();
operator/=(replacement);

Returns: *this.

[Example:

path("/foo").replace_filename("bar");  // yields "/bar" on POSIX
path("/").replace_filename("bar");     // yields "/bar" on POSIX

end example]

path& replace_extension(const path& replacement = path());

Effects:

  • Все существующие extension()([fs.path.decompose]) удаляются из пути в общем формате, затем

  • Если replacement не пусто и не начинается с точки, точка добавляется к имени пути в общем формате, затем

  • operator+=(replacement);.

Returns: *this.

void swap(path& rhs) noexcept;

Effects: Меняет местами содержимое (во всех форматах) двух путей.

Complexity: Постоянное время.

30.10.27.4.6 path native format observers [fs.path.native.obs]

Строка, возвращаемая всеми наблюдателями в собственном формате, находится в формате native pathname format.

const string_type& native() const noexcept;

Returns: Путь в собственном формате.

const value_type* c_str() const noexcept;

Returns: Эквивалентно native().c_­str().

operator string_type() const;

Returns: native().

[ Note: Преобразование в string_­type предусмотрено для того, чтобы объект класса path можно было передать в качестве аргумента существующим конструкторам файловых потоков стандартной библиотеки и открытым функциям. ] end note

template <class EcharT, class traits = char_traits<EcharT>, class Allocator = allocator<EcharT>> basic_string<EcharT, traits, Allocator> string(const Allocator& a = Allocator()) const;

Returns: native().

Remarks: Все выделение памяти, в том числе для возвращаемого значения, должно выполняться a. Преобразование, если оно есть, определяется [fs.path.cvt].

std::string string() const; std::wstring wstring() const; std::string u8string() const; std::u16string u16string() const; std::u32string u32string() const;

Returns: pathstring.

Remarks: Преобразование, если оно есть, выполняется в соответствии с указаниями [fs.path.cvt]. Кодировка строки, возвращаемой u8string() функцией, всегда UTF-8.

30.10.27.4.7 path generic format observers [fs.path.generic.obs]

Функции наблюдателя общего формата возвращают строки, отформатированные в соответствии с форматом generic pathname format. Одиночный'/'символ косой черты ( ) используется как directory-separator.

[ Example: В операционной системе, в которой используется обратная косая черта preferred-separator,

path("foo\\bar").generic_string()

возвращается "foo/bar". ] end example

template <class EcharT, class traits = char_traits<EcharT>, class Allocator = allocator<EcharT>> basic_string<EcharT, traits, Allocator> generic_string(const Allocator& a = Allocator()) const;

Returns: Путь в общем формате.

Remarks: Все выделение памяти, в том числе для возвращаемого значения, должно выполняться a. Преобразование, если оно есть, определяется [fs.path.cvt].

std::string generic_string() const; std::wstring generic_wstring() const; std::string generic_u8string() const; std::u16string generic_u16string() const; std::u32string generic_u32string() const;

Returns: Путь в общем формате.

Remarks: Преобразование, если оно есть, определяется [fs.path.cvt]. Кодировка строки, возвращаемой generic_­u8string() функцией, всегда UTF-8.

30.10.27.4.8 path compare [fs.path.compare]

int compare(const path& p) const noexcept;

Returns:

  • Значение меньше 0, если native() для элементов *this лексикографически меньше, чем native() для элементов p; иначе,

  • значение больше 0, если native() для элементов *this лексикографически больше, чем native() для элементов p; иначе,

  • 0.

Remarks: Элементы определяются как бы итерацией в полуоткрытом диапазоне [begin(), end()) для *this и p.

int compare(const string_type& s) const int compare(basic_string_view<value_type> s) const;

Returns: compare(path(s)).

int compare(const value_type* s) const

Returns: compare(path(s)).

30.10.27.4.9 path decomposition [fs.path.decompose]

path root_name() const;

Returns: root-name, если путь в универсальном формате включает root-name, в противном случае path().

path root_directory() const;

Returns: root-directory, если путь в универсальном формате включает root-directory, в противном случае path().

path root_path() const;

Returns: root_­name() / root_­directory().

path relative_path() const;

Returns: path Состоят из имени пути в общем формате, если !empty(), начиная с первым filenameAFTER root-path. В противном случае path().

path parent_path() const;

Returns: *this если !has_­relative_­path(), в противном случае путь, имя пути общего формата которого является самым длинным префиксом имени пути общего формата, *this который производит на один элемент меньше в своей итерации.

path filename() const;

Returns: relative_­path().empty() ? path() : *--end().

[Example:

path("/foo/bar.txt").filename();   // yields "bar.txt"
path("/foo/bar").filename();       // yields "bar"
path("/foo/bar/").filename();      // yields ""
path("/").filename();              // yields ""
path("//host").filename();         // yields ""
path(".").filename();              // yields "."
path("..").filename();             // yields ".."

end example]

path stem() const;

Returns: Позвольте f быть общим путем в формате filename(). Возвращает путь, имя которого в общем формате:

  • f, если он не содержит периодов, кроме начального периода, или состоит только из одного или двух периодов;

  • в противном случае - префикс f окончания перед последним периодом.

[Example:

std::cout << path("/foo/bar.txt").stem(); // outputs "bar"
path p = "foo.bar.baz.tar";
for (; !p.extension().empty(); p = p.stem())
  std::cout << p.extension() << '\n';
  // outputs: .tar
  //          .baz
  //          .bar

end example]

path extension() const;

Returns: путь, имя пути которого в общем формате является суффиксом, filename() не включенным в stem().

[Example:

path("/foo/bar.txt").extension();  // yields ".txt" and stem() is "bar"
path("/foo/bar").extension();      // yields "" and stem() is "bar"
path("/foo/.profile").extension(); // yields "" and stem() is ".profile"
path(".bar").extension();          // yields "" and stem() is ".bar"
path("..bar").extension();         // yields ".bar" and stem() is "."

end example]

[ Note: Точка включена в возвращаемое значение, чтобы можно было отличить отсутствие расширения от пустого расширения. ]end note

[ Note: В операционных системах, отличных от POSIX, для пути pэто может быть не так p.stem() + p.extension() == p.filename(), даже если имена путей общего формата совпадают. ] end note

30.10.27.4.10 path query [fs.path.query]

bool empty() const noexcept;

Returns: true если путь в общем формате пуст, иначе false.

bool has_root_path() const;

Returns: !root_­path().empty().

bool has_root_name() const;

Returns: !root_­name().empty().

bool has_root_directory() const;

Returns: !root_­directory().empty().

bool has_relative_path() const;

Returns: !relative_­path().empty().

bool has_parent_path() const;

Returns: !parent_­path().empty().

bool has_filename() const;

Returns: !filename().empty().

bool has_stem() const;

Returns: !stem().empty().

bool has_extension() const;

Returns: !extension().empty().

bool is_absolute() const;

Returns: true если путь в собственном формате содержит absolute path, иначе false.

[ Example: path("/").is_­absolute() предназначен true для операционных систем false на базе POSIX и для операционных систем на базе Windows. ] end example

bool is_relative() const;

Returns: !is_­absolute().

30.10.27.4.11 path generation [fs.path.gen]

path lexically_normal() const;

Returns: Путь, имя которого в универсальном формате normal form совпадает с именем пути в универсальном формате *this.

[Example:

assert(path("foo/./bar/..").lexically_normal() == "foo/");
assert(path("foo/.///bar/../").lexically_normal() == "foo/");

Вышеупомянутые утверждения будут успешными. В Windows directory-separatorсимволы возвращаемого пути будут обратной косой чертой, а не косой чертой, но это не влияет на path равенство. ] end example

path lexically_relative(const path& base) const;

Returns: *this сделано относительно base. Нет resolve символических ссылок. Не первое normalize *this или base.

Effects: Если root_­name() != base.root_­name() есть true или is_­absolute() != base.is_­absolute() есть true или !has_­root_­directory() && base.has_­root_­directory() есть true, возвращается path(). Определяет первый несовпадающий элемент *this и base как будто по:

auto [a, b] = mismatch(begin(), end(), base.begin(), base.end());

Потом,

  • если a == end() и b == base.end(), возвращается path("."); иначе

  • пусть n будет количество filenameэлементов [b, base.end()) , которых нет, dot или dot-dot минус количество, которые есть dot-dot. Если n<0, возвращается path(); иначе

  • возвращает объект класса path , созданный по умолчанию, за которым следует

    • приложение operator/=(path("..")) n времен, а затем

    • применение operator/= для каждого элемента в [a, end()).

[Example:

assert(path("/a/d").lexically_relative("/a/b/c") == "../../d");
assert(path("/a/b/c").lexically_relative("/a/d") == "../b/c");
assert(path("a/b/c").lexically_relative("a") == "b/c");
assert(path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
assert(path("a/b/c").lexically_relative("a/b/c") == ".");
assert(path("a/b").lexically_relative("c/d") == "../../a/b");

Вышеупомянутые утверждения будут успешными. В Windows directory-separatorсимволы возвращаемого пути будут обратной косой чертой, а не косой чертой, но это не влияет на path равенство. ]end example

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

[ Note: Если normalization необходимо , чтобы обеспечить последовательное согласование элементов, применяются lexically_­normal() к *this, baseили обоих. ] end note

path lexically_proximate(const path& base) const;

Returns: Если значение lexically_­relative(base) не является пустым путем, верните его. В противном случае вернитесь *this.

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

[ Note: Если normalization необходимо , чтобы обеспечить последовательное согласование элементов, применяются lexically_­normal() к *this, baseили обоих. ] end note

30.10.27.5 path iterators [fs.path.itr]

Итераторы пути перебирают элементы имени пути в generic format.

A path​::​iterator - это постоянный итератор, удовлетворяющий всем требованиям a, bidirectional iterator за исключением того, что для разыменяемых итераторов a и b типа path​::​iterator with a == bнет требований, чтобы *a и *b были привязаны к одному и тому же объекту. Его value_­type это path.

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

Для элементов имени пути в универсальном формате порядок прямого обхода следующий:

  • root-nameЭлемент, если он присутствует.

  • root-directoryЭлемент, если он присутствует. [ Note: Общий формат необходим для правильной работы лексикографического сравнения. ] end note

  • Каждый последующий filenameэлемент, если присутствует.

  • Пустой элемент, если присутствует конечный некорневой элемент directory-separator .

Порядок обратного обхода обратен прямому обходу.

iterator begin() const;

Returns: Итератор для первого присутствующего элемента в списке обхода выше. Если элементы отсутствуют, конечный итератор.

iterator end() const;

Returns: Конечный итератор.

30.10.27.6 path non-member functions [fs.path.nonmember]

void swap(path& lhs, path& rhs) noexcept;

Effects: Эквивалентно: lhs.swap(rhs);

size_t hash_value (const path& p) noexcept;

Returns: Хэш-значение для пути p. Если по двум путям, p1 == p2 то hash_­value(p1) == hash_­value(p2).

bool operator< (const path& lhs, const path& rhs) noexcept;

Returns: lhs.compare(rhs) < 0.

bool operator<=(const path& lhs, const path& rhs) noexcept;

Returns: !(rhs < lhs).

bool operator> (const path& lhs, const path& rhs) noexcept;

Returns: rhs < lhs.

bool operator>=(const path& lhs, const path& rhs) noexcept;

Returns: !(lhs < rhs).

bool operator==(const path& lhs, const path& rhs) noexcept;

Returns: !(lhs < rhs) && !(rhs < lhs).

[ Note: Равенство путей и эквивалентность путей имеют разную семантику.

  • Равенство определяется тем, кто path не является членом operator==, который рассматривает только лексические представления двух путей. [ Example: path("foo") == "bar" никогда не бывает true. ] end example

  • Эквивалентность определяется equivalent() функцией, не являющейся членом, которая определяет, есть ли два пути resolve к одному и тому же объекту файловой системы. [ Example: equivalent("foo", "bar") будет, true когда оба пути разрешатся в один и тот же файл. ] end example

Программисты, желающие определить, являются ли два пути «одинаковыми», должны решить, означает ли «одинаковый» «одно и то же представление» или «разрешить один и тот же фактический файл», и выбрать соответствующую функцию соответственно. ] end note

bool operator!=(const path& lhs, const path& rhs) noexcept;

Returns: !(lhs == rhs).

path operator/ (const path& lhs, const path& rhs);

Effects: Эквивалентно: return path(lhs) /= rhs;

30.10.27.6.1 path inserter and extractor [fs.path.io]

template <class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const path& p);

Effects: Эквивалент: os << quoted(p.string<charT, traits>()); [ функция описана в . ]Note: quoted [quoted.manip] end note

Returns: os.

template <class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is, path& p);

Effects: Эквивалентно:

basic_string<charT, traits> tmp;
is >> quoted(tmp);
p = tmp;

Returns: is.

30.10.27.6.2 path factory functions [fs.path.factory]

template <class Source> path u8path(const Source& source); template <class InputIterator> path u8path(InputIterator first, InputIterator last);

Requires: Последовательности source и [first, last) кодируются в кодировке UTF-8. Тип значения Source и InputIterator есть char.

Returns:

  • Если value_­type есть, char а текущий native narrow encoding - UTF-8, вернуть path(source) или path(first, last); иначе,

  • если value_­type есть, wchar_­t а собственная широкая кодировка - UTF-16, или если value_­type есть, char16_­t или char32_­t, преобразовать source или [first, last) во временное, tmpтипа string_­type и возврата path(tmp); иначе,

  • преобразовать source или [first, last) во временное, tmpтипа u32string и возврата path(tmp).

Remarks: Argument format conversion применяется к аргументам этих функций. Как выполняется преобразование кодировки Unicode, не указано.

[ Example: Строка должна быть прочитана из базы данных, закодированной в UTF-8, и использована для создания каталога с использованием собственной кодировки для имен файлов:

namespace fs = std::filesystem;
std::string utf8_string = read_utf8_data();
fs::create_directory(fs::u8path(utf8_string));

Для операционных систем на основе POSIX с собственной узкой кодировкой, установленной на UTF-8, кодирование или преобразование типов не происходит.

Для операционных систем на основе POSIX, в которых для собственной узкой кодировки не задано значение UTF-8, происходит преобразование в UTF-32, за которым следует преобразование в текущую собственную узкую кодировку. Некоторые символы Unicode могут не иметь собственного представления набора символов.

Для операционных систем на базе Windows происходит преобразование из UTF-8 в UTF-16. ] end example

30.10.28 Class filesystem_­error [fs.class.filesystem_error]

namespace std::filesystem {
  class filesystem_error : public system_error {
  public:
    filesystem_error(const string& what_arg, error_code ec);
    filesystem_error(const string& what_arg,
                     const path& p1, error_code ec);
    filesystem_error(const string& what_arg,
                     const path& p1, const path& p2, error_code ec);

    const path& path1() const noexcept;
    const path& path2() const noexcept;
    const char* what() const noexcept override;
  };
}

Класс filesystem_­error определяет тип объектов, создаваемых как исключения для сообщения об ошибках файловой системы из функций, описанных в этом подпункте.

30.10.28.1 filesystem_­error members [filesystem_error.members]

Предоставляются конструкторы, которые хранят ноль, один или два пути, связанных с ошибкой.

filesystem_error(const string& what_arg, error_code ec);

Postconditions: Постусловия этой функции указаны в таблице 119.

Таблица 119 - filesystem_­error(const string&, error_­code) эффекты
ВыражениеЦенить
runtime_­error​::​what() what_­arg.c_­str()
code() ec
path1().empty() true
path2().empty() true

filesystem_error(const string& what_arg, const path& p1, error_code ec);

Postconditions: Постусловия этой функции указаны в таблице 120.

Таблица 120 - filesystem_­error(const string&, const path&, error_­code) эффекты
ВыражениеЦенить
runtime_­error​::​what() what_­arg.c_­str()
code() ec
path1() Ссылка на сохраненную копию p1
path2().empty() true

filesystem_error(const string& what_arg, const path& p1, const path& p2, error_code ec);

Postconditions: Постусловия этой функции указаны в таблице 121.

Таблица 121 - filesystem_­error(const string&, const path&, const path&, error_­code) эффекты
ВыражениеЦенить
runtime_­error​::​what() what_­arg.c_­str()
code() ec
path1() Ссылка на сохраненную копию p1
path2() Ссылка на сохраненную копию p2

const path& path1() const noexcept;

Returns: Ссылка на копию, p1 сохраненную конструктором, или, если ее нет, на пустой путь.

const path& path2() const noexcept;

Returns: Ссылка на копию, p2 сохраненную конструктором, или, если ее нет, на пустой путь.

const char* what() const noexcept override;

Returns: Строка, содержащая runtime_­error​::​what(). Точный формат не указан. Реализации приветствуются, но не обязаны включать в возвращаемую строку, path1.native_­string() если она не пуста, path2.native_­string() если не пуста, и system_­error​::​what() строки.

30.10.29 Enumerations [fs.enum]

30.10.29.1 Enum path​::​format [fs.enum.path.format]

Это перечисление определяет константы, используемые для идентификации формата символьной последовательности, со значениями, перечисленными в таблице 122.

Таблица 122 - Enum path​::​format
ИмяИмея в виду
native_­format Собственный формат имени пути.
generic_­format Общий формат имени пути.
auto_­format Интерпретация формата символьной последовательности определяется реализацией. Реализация может проверять содержимое последовательности символов, чтобы определить формат. [ Note: Для систем на основе POSIX собственный и общий форматы эквивалентны, и последовательность символов всегда должна интерпретироваться одинаково. ] end note

30.10.29.2 Enum class file_­type [fs.enum.file_type]

Этот класс перечисления определяет константы, используемые для идентификации типов файлов, со значениями, перечисленными в Табл 123.

Таблица 123 - класс Enum file_­type
ПостоянныйИмея в виду
none Тип файла не определен или произошла ошибка при попытке определить тип.
not_­found Псевдотип, указывающий, что файл не найден. [Если Note: файл не найден, это не считается ошибкой при определении типа файла. ] end note
regular Обычный файл
directory Каталог файлов
symlink Файл символьной ссылки
block Заблокировать специальный файл
character Специальный файл символов
fifo FIFO или файл трубы
socket Файл сокета
implementation-defined Реализации, которые поддерживают файловые системы, имеющие типы файлов в дополнение к вышеуказанным file_­type типам, должны предоставлять константы, определяемые реализацией, file_­type для отдельной идентификации каждого из этих дополнительных типов файлов.
unknown Файл существует, но тип не может быть определен

30.10.29.3 Enum class copy_­options [fs.enum.copy.opts]

enum class Тип copy_­options представляет собой тип битовой маски ([bitmask.types]) , который определяет битовую маску константа используется для управления семантикой операций копирования. Константы указываются в группах опций со значениями, указанными в таблице 124. Константа none отображается в каждой группе опций с целью демонстрации; реализации должны предоставлять только одно определение.

Таблица 124 - класс Enum copy_­options
Группа опций, управляющая copy_­file эффектами функций для существующих целевых файлов
ПостоянныйИмея в виду
none (По умолчанию) Ошибка; Файл уже существует.
skip_­existing Не перезаписывать существующий файл, не сообщать об ошибке.
overwrite_­existing Перезаписать существующий файл.
update_­existing Замените существующий файл, если он старше заменяемого.
Группа опций, управляющая copy эффектами функций для подкаталогов
ПостоянныйИмея в виду
none (По умолчанию) Не копировать подкаталоги.
recursive Рекурсивно копируйте подкаталоги и их содержимое.
Группа опций, управляющая copy эффектами функций для символьных ссылок
ПостоянныйИмея в виду
none (По умолчанию) Переход по символическим ссылкам.
copy_­symlinks Копируйте символические ссылки как символические ссылки, а не копируйте файлы, на которые они указывают.
skip_­symlinks Игнорируйте символические ссылки.
Группа опций, управляющая copy эффектами функций для выбора формы копирования
ПостоянныйИмея в виду
none (По умолчанию) Копировать содержимое.
directories_­only Копировать только структуру каталогов, не копировать файлы, не являющиеся каталогами.
create_­symlinks Делайте символические ссылки вместо копий файлов. Исходный путь должен быть абсолютным, если путь назначения не находится в текущем каталоге.
create_­hard_­links Делайте жесткие ссылки вместо копий файлов.

30.10.29.4 Enum class perms [fs.enum.perms]

enum class Типа perms является , bitmask type что указывает Bitmask константы используются для идентификации прав доступа к файлам, со значениями , перечисленными в табл 125.

Таблица 125 - класс Enum perms
ИмяЦенитьPOSIXОпределение или примечания
(восьмеричный)макрос
none 0 Для файла не установлены разрешения.
owner_­read 0400 S_­IRUSR Разрешение на чтение, владелец
owner_­write 0200 S_­IWUSR Разрешение на запись, владелец
owner_­exec 0100 S_­IXUSR Разрешение на выполнение / поиск, владелец
owner_­all 0700 S_­IRWXU Читать, писать, выполнять / искать по владельцу;
owner_­read | owner_­write | owner_­exec
group_­read 040 S_­IRGRP Разрешение на чтение, группа
group_­write 020 S_­IWGRP Разрешение на запись, группа
group_­exec 010 S_­IXGRP Разрешение на выполнение / поиск, группа
group_­all 070 S_­IRWXG Чтение, запись, выполнение / поиск по группе;
group_­read | group_­write | group_­exec
others_­read 04 S_­IROTH Разрешение на чтение, другие
others_­write 02 S_­IWOTH Разрешение на запись, другие
others_­exec 01 S_­IXOTH Разрешение на выполнение / поиск, другие
others_­all 07 S_­IRWXO Читать, писать, выполнять / искать другие;
others_­read | others_­write | others_­exec
all 0777 owner_­all | group_­all | others_­all
set_­uid 04000 S_­ISUID Установить идентификатор пользователя при выполнении
set_­gid 02000 S_­ISGID Установить идентификатор группы при выполнении
sticky_­bit 01000 S_­ISVTX Зависит от операционной системы.
mask 07777 all | set_­uid | set_­gid | sticky_­bit
unknown 0xFFFF Разрешения неизвестны, например, когда file_­status объект создается без указания разрешений.

30.10.29.5 Enum class perm_­options [fs.enum.perm.opts]

enum class Тип perm_­options представляет собой тип битовой маски ([bitmask.types]) , который определяет битовую маску константа используется для управления семантикой операций разрешений, со значениями , перечисленных в табле 126. Константы битовой маски являются элементами битовой маски. В таблице 126 perm обозначает значение perms переданного типа permissions.

Таблица 126 - класс Enum perm_­options
ИмяИмея в виду
replace permissions должен заменить биты разрешений файла на perm
add permissions должен заменить биты разрешения файла побитовым ИЛИ perm и текущими битами разрешения файла.
remove permissions должен заменить биты разрешений файла побитовым И дополнением perm и текущими битами разрешений файла.
nofollow permissions должен изменять разрешения самой символической ссылки, а не разрешения файла, к которому эта ссылка разрешает.

30.10.29.6 Enum class directory_­options [fs.enum.dir.opts]

enum class Тип directory_­options представляет собой тип битовая ([bitmask.types]), задающий Bitmask константы используются для определения вариантов обхода каталога, со значениями , перечисленными в табл 127.

Таблица 127 - класс Enum directory_­options
ИмяИмея в виду
none (По умолчанию) Пропускать символические ссылки на каталог, отказано в разрешении - это ошибка.
follow_­directory_­symlink Следуйте, а не пропускайте символические ссылки на каталоги.
skip_­permission_­denied Пропускать каталоги, для которых в противном случае было бы отказано в разрешении.

30.10.30 Class file_­status [fs.class.file_status]

namespace std::filesystem {
  class file_status {
  public:
    // [fs.file_status.cons], constructors and destructor
    file_status() noexcept : file_status(file_type::none) {}
    explicit file_status(file_type ft,
                         perms prms = perms::unknown) noexcept;
    file_status(const file_status&) noexcept = default;
    file_status(file_status&&) noexcept = default;
    ~file_status();

    // assignments:
    file_status& operator=(const file_status&) noexcept = default;
    file_status& operator=(file_status&&) noexcept = default;

    // [fs.file_status.mods], modifiers
    void       type(file_type ft) noexcept;
    void       permissions(perms prms) noexcept;

    // [fs.file_status.obs], observers
    file_type  type() const noexcept;
    perms      permissions() const noexcept;
  };
}

Объект типа file_­status хранит информацию о типе и разрешениях файла.

30.10.30.1 file_­status constructors [fs.file_status.cons]

explicit file_status(file_type ft, perms prms = perms::unknown) noexcept;

Postconditions: type() == ft и permissions() == prms.

30.10.30.2 file_­status observers [fs.file_status.obs]

file_type type() const noexcept;

Returns: Значение, type() заданное постусловиями последнего вызова конструктора operator=, или type(file_­type) функции.

perms permissions() const noexcept;

Returns: Значение, permissions() заданное постусловиями последнего вызова конструктора operator=, или permissions(perms) функции.

30.10.30.3 file_­status modifiers [fs.file_status.mods]

void type(file_type ft) noexcept;

Postconditions: type() == ft.

void permissions(perms prms) noexcept;

Postconditions: permissions() == prms.

30.10.31 Class directory_­entry [fs.class.directory_entry]

namespace std::filesystem {
  class directory_entry {
  public:
    // [fs.dir.entry.cons], constructors and destructor
    directory_entry() noexcept = default;
    directory_entry(const directory_entry&) = default;
    directory_entry(directory_entry&&) noexcept = default;
    explicit directory_entry(const path& p);
    directory_entry(const path& p, error_code& ec);
    ~directory_entry();

    // assignments:
    directory_entry& operator=(const directory_entry&) = default;
    directory_entry& operator=(directory_entry&&) noexcept = default;

    // [fs.dir.entry.mods], modifiers
    void assign(const path& p);
    void assign(const path& p, error_code& ec);
    void replace_filename(const path& p);
    void replace_filename(const path& p, error_code& ec);
    void refresh();
    void refresh(error_code& ec) noexcept;

    // [fs.dir.entry.obs], observers
    const path& path() const noexcept;
    operator const path&() const noexcept;
    bool exists() const;
    bool exists(error_code& ec) const noexcept;
    bool is_block_file() const;
    bool is_block_file(error_code& ec) const noexcept;
    bool is_character_file() const;
    bool is_character_file(error_code& ec) const noexcept;
    bool is_directory() const;
    bool is_directory(error_code& ec) const noexcept;
    bool is_fifo() const;
    bool is_fifo(error_code& ec) const noexcept;
    bool is_other() const;
    bool is_other(error_code& ec) const noexcept;
    bool is_regular_file() const;
    bool is_regular_file(error_code& ec) const noexcept;
    bool is_socket() const;
    bool is_socket(error_code& ec) const noexcept;
    bool is_symlink() const;
    bool is_symlink(error_code& ec) const noexcept;
    uintmax_t file_size() const;
    uintmax_t file_size(error_code& ec) const noexcept;
    uintmax_t hard_link_count() const;
    uintmax_t hard_link_count(error_code& ec) const noexcept;
    file_time_type last_write_time() const;
    file_time_type last_write_time(error_code& ec) const noexcept;
    file_status status() const;
    file_status status(error_code& ec) const noexcept;
    file_status symlink_status() const;
    file_status symlink_status(error_code& ec) const noexcept;

    bool operator< (const directory_entry& rhs) const noexcept;
    bool operator==(const directory_entry& rhs) const noexcept;
    bool operator!=(const directory_entry& rhs) const noexcept;
    bool operator<=(const directory_entry& rhs) const noexcept;
    bool operator> (const directory_entry& rhs) const noexcept;
    bool operator>=(const directory_entry& rhs) const noexcept;

  private:
    path pathobject;                 // exposition only
    friend class directory_iterator; // exposition only
  };
}

А directory_­entry объект хранит path объект и могут хранить дополнительные объекты для атрибутов файлов , такими как жесткие ссылки, статус, SYMLINK статуса, размер файла и время последней записи.

Реализациям рекомендуется сохранять такие дополнительные атрибуты файлов во время итерации каталога, если их значения доступны, и сохранение значений позволило бы реализации исключить доступ к файловой системе со стороны directory_­entry функций наблюдателя ([fs.op.funcs]). Такие сохраненные значения атрибутов файла называются cached.

[ Note: Для демонстрации class directory_­iterator ([fs.class.directory_iterator]) показан выше как друг класса directory_­entry. Friendship позволяет directory_­iterator реализации кэшировать уже доступные значения атрибутов непосредственно в directory_­entry объект без затрат на ненужный вызов refresh(). ]end note

[Example:

using namespace std::filesystem;

// use possibly cached last write time to minimize disk accesses
for (auto&& x : directory_iterator("."))
{
  std::cout << x.path() << " " << x.last_write_time() << std::endl;
}

// call refresh() to refresh a stale cache
for (auto&& x : directory_iterator("."))
{
  lengthy_function(x.path());  // cache becomes stale
  x.refresh();
  std::cout << x.path() << " " << x.last_write_time() << std::endl;
}

В реализациях, которые не кэшируют время последней записи, оба цикла приведут к потенциально дорогостоящему вызову std​::​filesystem​::​last_­write_­time функции. В реализациях, которые кэшируют время последней записи, первый цикл будет использовать кешированное значение и поэтому не приведет к потенциально дорогостоящему вызову std​::​filesystem​::​last_­write_­time функции. Код переносим для любой реализации, независимо от того, использует ли он кеширование или нет. ]end example

30.10.31.1 directory_­entry constructors [fs.dir.entry.cons]

explicit directory_entry(const path& p); directory_entry(const path& p, error_code& ec);

Effects: Создает объект типа directory_­entrythen refresh() или refresh(ec)соответственно.

Postconditions: path() == p если ошибки не возникает, иначе path() == std​::​filesystem​::​path().

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

30.10.31.2 directory_­entry modifiers [fs.dir.entry.mods]

void assign(const path& p); void assign(const path& p, error_code& ec);

Effects: Эквивалентно pathobject = p, then refresh() или refresh(ec), соответственно. В случае ошибки значения любых кэшированных атрибутов не указываются.

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

void replace_filename(const path& p); void replace_filename(const path& p, error_code& ec);

Effects: Эквивалентно pathobject.replace_­filename(p), then refresh() или refresh(ec), соответственно. В случае ошибки значения любых кэшированных атрибутов не указываются.

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

void refresh(); void refresh(error_code& ec) noexcept;

Effects: Сохраняет текущие значения любых кэшированных атрибутов файла, в который p разрешается. При возникновении ошибки сообщается об ошибке ([fs.err.report]), и значения любых кэшированных атрибутов не указываются.

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

[ Note: Реализациям directory_­iterator ([fs.class.directory_iterator]) запрещено прямо или косвенно вызывать refresh функцию, поскольку она должна обращаться к внешней файловой системе, а цель кэширования - избежать ненужных обращений к файловой системе. ] end note

30.10.31.3 directory_­entry observers [fs.dir.entry.obs]

Неквалифицированные имена функций в Returns: элементах directory_­entry наблюдателей, описанных ниже, относятся к членам std​::​filesystem пространства имен.

const path& path() const noexcept; operator const path&() const noexcept;

Returns: pathobject.

bool exists() const; bool exists(error_code& ec) const noexcept;

Returns: exists(this->status()) или exists(this->status(), ec), соответственно.

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

bool is_block_file() const; bool is_block_file(error_code& ec) const noexcept;

Returns: is_­block_­file(this->status()) или is_­block_­file(this->status(), ec), соответственно.

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

bool is_character_file() const; bool is_character_file(error_code& ec) const noexcept;

Returns: is_­character_­file(this->status()) или is_­character_­file(this->status(), ec), соответственно.

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

bool is_directory() const; bool is_directory(error_code& ec) const noexcept;

Returns: is_­directory(this->status()) или is_­directory(this->status(), ec), соответственно.

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

bool is_fifo() const; bool is_fifo(error_code& ec) const noexcept;

Returns: is_­fifo(this->status()) или is_­fifo(this->status(), ec), соответственно.

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

bool is_other() const; bool is_other(error_code& ec) const noexcept;

Returns: is_­other(this->status()) или is_­other(this->status(), ec), соответственно.

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

bool is_regular_file() const; bool is_regular_file(error_code& ec) const noexcept;

Returns: is_­regular_­file(this->status()) или is_­regular_­file(this->status(), ec), соответственно.

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

bool is_socket() const; bool is_socket(error_code& ec) const noexcept;

Returns: is_­socket(this->status()) или is_­socket(this->status(), ec), соответственно.

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

bool is_symlink() const; bool is_symlink(error_code& ec) const noexcept;

Returns: is_­symlink(this->symlink_­status()) или is_­symlink(this->symlink_­status(), ec), соответственно.

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

uintmax_t file_size() const; uintmax_t file_size(error_code& ec) const noexcept;

Returns: Если кэшировано, значение атрибута размера файла. В противном случае file_­size(path()) или file_­size(path(), ec)соответственно.

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

uintmax_t hard_link_count() const; uintmax_t hard_link_count(error_code& ec) const noexcept;

Returns: Если кэшировано, значение атрибута количества жестких ссылок. В противном случае hard_­link_­count(path()) или hard_­link_­count(path(), ec)соответственно.

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

file_time_type last_write_time() const; file_time_type last_write_time(error_code& ec) const noexcept;

Returns: Если кэшировано, последнее значение атрибута времени записи. В противном случае last_­write_­time(path()) или last_­write_­time(path(), ec)соответственно.

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

file_status status() const; file_status status(error_code& ec) const noexcept;

Returns: Если кэшировано, значение атрибута статуса. В противном случае status(path()) или status(path(), ec)соответственно.

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

file_status symlink_status() const; file_status symlink_status(error_code& ec) const noexcept;

Returns: Если кэшировано, значение атрибута статуса символической ссылки. В противном случае symlink_­status(path()) или symlink_­status(path(), ec)соответственно.

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

bool operator==(const directory_entry& rhs) const noexcept;

Returns: pathobject == rhs.pathobject.

bool operator!=(const directory_entry& rhs) const noexcept;

Returns: pathobject != rhs.pathobject.

bool operator< (const directory_entry& rhs) const noexcept;

Returns: pathobject < rhs.pathobject.

bool operator<=(const directory_entry& rhs) const noexcept;

Returns: pathobject <= rhs.pathobject.

bool operator> (const directory_entry& rhs) const noexcept;

Returns: pathobject > rhs.pathobject.

bool operator>=(const directory_entry& rhs) const noexcept;

Returns: pathobject >= rhs.pathobject.

30.10.32 Class directory_­iterator [fs.class.directory_iterator]

Объект типа directory_­iterator предоставляет итератор для последовательности directory_­entry элементов, представляющих путь и любые кэшированные значения атрибутов ([fs.class.directory_entry]) для каждого файла в каталоге или в определяемом реализацией типе файла, подобном каталогу. [ Note: Для перехода к подкаталогам см. Class recursive_­directory_­iterator ([fs.class.rec.dir.itr]). ] end note

namespace std::filesystem {
  class directory_iterator {
  public:
    using iterator_category = input_iterator_tag;
    using value_type        = directory_entry;
    using difference_type   = ptrdiff_t;
    using pointer           = const directory_entry*;
    using reference         = const directory_entry&;

    // [fs.dir.itr.members], member functions
    directory_iterator() noexcept;
    explicit directory_iterator(const path& p);
    directory_iterator(const path& p, directory_options options);
    directory_iterator(const path& p, error_code& ec) noexcept;
    directory_iterator(const path& p, directory_options options,
                       error_code& ec) noexcept;
    directory_iterator(const directory_iterator& rhs);
    directory_iterator(directory_iterator&& rhs) noexcept;
    ~directory_iterator();

    directory_iterator& operator=(const directory_iterator& rhs);
    directory_iterator& operator=(directory_iterator&& rhs) noexcept;

    const directory_entry& operator*() const;
    const directory_entry* operator->() const;
    directory_iterator&    operator++();
    directory_iterator&    increment(error_code& ec) noexcept;

    // other members as required by [input.iterators], input iterators
  };
}

directory_­iterator удовлетворяет требованиям input iterator.

Если итератор типа directory_­iterator сообщает об ошибке или проходит мимо последнего элемента каталога, этот итератор должен стать равным конечному значению итератора. Конструктор по directory_­iterator умолчанию должен создать итератор, равный значению конечного итератора, и это должен быть единственный допустимый итератор для конечного условия.

Конечный итератор не может быть разыменован.

Два конечных итератора всегда равны. Конечный итератор не должен быть равен нескончаемому итератору.

Результатом вызова path() члена directory_­entry объекта, полученного путем разыменования a, directory_­iterator является ссылка на path объект, состоящий из аргумента каталога, из которого был создан итератор, с именем файла записи каталога, добавленным, как если бы operator/=.

Итерация каталога не должна приводить к появлению записей каталога для каталогов current (dot) и parent (dot-dot).

Порядок записей каталога, полученных путем разыменования последовательных приращений a, directory_­iterator не определен.

Конструкторы и неконстантные directory_­iterator функции - члены хранят значения любых кэшированных атрибутов ([fs.class.directory_entry]) в directory_­entry элементе, возвращаемом operator*(). directory_­iterator функции-члены не должны прямо или косвенно вызывать какие-либо directory_­entry refresh функции. [ Note: Точный механизм хранения кэшированных значений атрибутов не предоставляется пользователям. Для directory_­iterator демонстрации класс показан [fs.class.directory_entry] как друг класса directory_­entry. ]end note

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

[ Note: Если файл удаляется из каталога или добавляется в каталог после создания a directory_­iterator для каталога, не указано, приведет ли последующее увеличение итератора к тому, что итератор будет ссылаться на удаленную или добавленную запись каталога. См. POSIX readdir_­r. ]end note

30.10.32.1 directory_­iterator members [fs.dir.itr.members]

directory_iterator() noexcept;

Effects: Создает конечный итератор.

explicit directory_iterator(const path& p); directory_iterator(const path& p, directory_options options); directory_iterator(const path& p, error_code& ec) noexcept; directory_iterator(const path& p, directory_options options, error_code& ec) noexcept;

Effects: Для каталога, который p разрешается в, создает итератор для первого элемента в последовательности directory_­entry элементов, представляющих файлы в каталоге, если таковые имеются; в противном случае - конечный итератор. Однако если

(options & directory_options::skip_permission_denied) != directory_options::none

и конструкция обнаруживает ошибку, указывающую, что в доступе p отказано, создает конечный итератор и не сообщает об ошибке.

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

[ Note: Для перебора текущего каталога используйте directory_­iterator(".") вместо directory_­iterator(""). ] end note

directory_iterator(const directory_iterator& rhs); directory_iterator(directory_iterator&& rhs) noexcept;

Effects: Создает объект класса directory_­iterator.

Postconditions: *this имеет исходное значение rhs.

directory_iterator& operator=(const directory_iterator& rhs); directory_iterator& operator=(directory_iterator&& rhs) noexcept;

Effects: Если *this и rhs являются одним и тем же объектом, член не имеет никакого эффекта.

Postconditions: *this имеет исходное значение rhs.

Returns: *this.

directory_iterator& operator++(); directory_iterator& increment(error_code& ec) noexcept;

Effects: Как указано для операции увеличения префикса Input iterators.

Returns: *this.

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

30.10.32.2 directory_­iterator non-member functions [fs.dir.itr.nonmembers]

Эти функции обеспечивают доступ к диапазону для directory_­iterator.

directory_iterator begin(directory_iterator iter) noexcept;

Returns: iter.

directory_iterator end(const directory_iterator&) noexcept;

Returns: directory_­iterator().

30.10.33 Class recursive_­directory_­iterator [fs.class.rec.dir.itr]

Объект типа recursive_­directory_­iterator предоставляет итератор для последовательности directory_­entry элементов, представляющих файлы в каталоге или в определяемом реализацией типе файла, подобном каталогу, и его подкаталогам.

namespace std::filesystem {
  class recursive_directory_iterator {
  public:
    using iterator_category = input_iterator_tag;
    using value_type        = directory_entry;
    using difference_type   = ptrdiff_t;
    using pointer           = const directory_entry*;
    using reference         = const directory_entry&;

    // [fs.rec.dir.itr.members], constructors and destructor
    recursive_directory_iterator() noexcept;
    explicit recursive_directory_iterator(const path& p);
    recursive_directory_iterator(const path& p, directory_options options);
    recursive_directory_iterator(const path& p, directory_options options,
                                 error_code& ec) noexcept;
    recursive_directory_iterator(const path& p, error_code& ec) noexcept;
    recursive_directory_iterator(const recursive_directory_iterator& rhs);
    recursive_directory_iterator(recursive_directory_iterator&& rhs) noexcept;
    ~recursive_directory_iterator();

    // [fs.rec.dir.itr.members], observers
    directory_options  options() const;
    int                depth() const;
    bool               recursion_pending() const;

    const directory_entry& operator*() const;
    const directory_entry* operator->() const;

    // [fs.rec.dir.itr.members], modifiers
    recursive_directory_iterator&
      operator=(const recursive_directory_iterator& rhs);
    recursive_directory_iterator&
      operator=(recursive_directory_iterator&& rhs) noexcept;

    recursive_directory_iterator& operator++();
    recursive_directory_iterator& increment(error_code& ec) noexcept;

    void pop();
    void pop(error_code& ec);
    void disable_recursion_pending();

    // other members as required by [input.iterators], input iterators
  };
}

Вызов options, depth, recursion_­pending, pop или disable_­recursion_­pending на итератора , который не разыменовываемое приводит к неопределенному поведению.

Поведение a recursive_­directory_­iterator такое же, как и для a, directory_­iterator если не указано иное.

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

30.10.33.1 recursive_­directory_­iterator members [fs.rec.dir.itr.members]

recursive_directory_iterator() noexcept;

Effects: Создает конечный итератор.

explicit recursive_directory_iterator(const path& p); recursive_directory_iterator(const path& p, directory_options options); recursive_directory_iterator(const path& p, directory_options options, error_code& ec) noexcept; recursive_directory_iterator(const path& p, error_code& ec) noexcept;

Effects: Создает итератор, представляющий первую запись в каталоге, в который p разрешается, если есть; в противном случае - конечный итератор. Однако если

(options & directory_options::skip_permission_denied) != directory_options::none

и конструкция обнаруживает ошибку, указывающую, что в доступе p отказано, создает конечный итератор и не сообщает об ошибке.

Postconditions: options() == options для подписей с directory_­options аргументом, иначе options() == directory_­options​::​none.

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

[ Note: Для перебора текущего каталога используйте recursive_­directory_­iterator(".") вместо recursive_­directory_­iterator(""). ] end note

[ Note: По умолчанию recursive_­directory_­iterator не следует символическим ссылкам на каталоги. Чтобы следовать символическим ссылкам каталога, укажите options как ] directory_­options​::​follow_­directory_­symlink end note

recursive_directory_iterator(const recursive_directory_iterator& rhs);

Effects: Создает объект класса recursive_­directory_­iterator.

Postconditions:

  • options() == rhs.options()

  • depth() == rhs.depth()

  • recursion_­pending() == rhs.recursion_­pending()

recursive_directory_iterator(recursive_directory_iterator&& rhs) noexcept;

Effects: Создает объект класса recursive_­directory_­iterator.

Postconditions: options(), depth()И recursion_­pending() имеет значение , которые rhs.options(), rhs.depth()и rhs.recursion_­pending(), соответственно, имели перед вызовом функции.

recursive_directory_iterator& operator=(const recursive_directory_iterator& rhs);

Effects: Если *this и rhs являются одним и тем же объектом, член не имеет никакого эффекта.

Postconditions:

  • options() == rhs.options()

  • depth() == rhs.depth()

  • recursion_­pending() == rhs.recursion_­pending()

Returns: *this.

recursive_directory_iterator& operator=(recursive_directory_iterator&& rhs) noexcept;

Effects: Если *this и rhs являются одним и тем же объектом, член не имеет никакого эффекта.

Postconditions: options(), depth()И recursion_­pending() имеет значение , которые rhs.options(), rhs.depth()и rhs.recursion_­pending(), соответственно, имели перед вызовом функции.

Returns: *this.

directory_options options() const;

Returns: Значение аргумента, переданного конструктору для options параметра, если он присутствует, в противном случае directory_­options​::​none.

Throws: Ничего такого.

int depth() const;

Returns: Текущая глубина просматриваемого дерева каталогов. [ Note: Начальный каталог - это глубина 0, его непосредственные подкаталоги - это глубина 1и так далее. ] end note

Throws: Ничего такого.

bool recursion_pending() const;

Returns: true if disable_­recursion_­pending() не был вызван после предыдущей операции построения или приращения, в противном случае false.

Throws: Ничего такого.

recursive_directory_iterator& operator++(); recursive_directory_iterator& increment(error_code& ec) noexcept;

Effects: Как указано для операции увеличения префикса Input iterators, за исключением того, что:

  • Если на текущей глубине больше нет записей, то если depth() != 0 итерация по родительскому каталогу возобновляется; иначе *this = recursive_­directory_­iterator().

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

    recursion_pending() && is_directory((*this)->status()) &&
    (!is_symlink((*this)->symlink_status()) ||
     (options() & directory_options::follow_directory_symlink) != directory_options::none)

    то либо каталог (*this)->path() рекурсивно перебирается, либо, если

    (options() & directory_options::skip_permission_denied) != directory_options::none

    и возникает ошибка, указывающая на то, что в разрешении на доступ к каталогу (*this)->path() отказано, тогда каталог (*this)->path() обрабатывается как пустой каталог и об ошибках не сообщается.

Returns: *this.

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

void pop(); void pop(error_code& ec);

Effects: Если depth() == 0установите *this в recursive_­directory_­iterator(). В противном случае прекратите итерацию каталога, по которому в настоящее время выполняется итерация, и продолжите итерацию по родительскому каталогу.

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

void disable_recursion_pending();

Postconditions: recursion_­pending() == false.

[ Note: disable_­recursion_­pending() используется для предотвращения нежелательной рекурсии в каталог. ] end note

30.10.33.2 recursive_­directory_­iterator non-member functions [fs.rec.dir.itr.nonmembers]

Эти функции позволяют использовать recursive_­directory_­iterator операторы for на основе диапазона.

recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;

Returns: iter.

recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;

Returns: recursive_­directory_­iterator().

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