30 Input/output library [input.output]

30.10 File systems [filesystems]

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: Для демонстрации classdirectory_­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_­entrythenrefresh() или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, thenrefresh() или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), thenrefresh() или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.