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
explicit directory_entry(const path& p);
directory_entry(const path& p, error_code& ec);
Throws: Как указано в[fs.err.report].
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
Неквалифицированные имена функций вReturns: элементах directory_entry наблюдателей, описанных ниже, относятся к членам std::filesystem пространства имен.
const path& path() const noexcept;
operator const path&() const noexcept;
bool exists() const;
bool exists(error_code& ec) const noexcept;
Throws: Как указано в[fs.err.report].
bool is_block_file() const;
bool is_block_file(error_code& ec) const noexcept;
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;
Throws: Как указано в[fs.err.report].
bool is_fifo() const;
bool is_fifo(error_code& ec) const noexcept;
Throws: Как указано в[fs.err.report].
bool is_other() const;
bool is_other(error_code& ec) const noexcept;
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;
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;
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;