namespace std::filesystem {
class directory_entry {
public:
directory_entry() noexcept = default;
directory_entry(const directory_entry&) = default;
directory_entry(directory_entry&&) noexcept = default;
explicit directory_entry(const filesystem::path& p);
directory_entry(const filesystem::path& p, error_code& ec);
~directory_entry();
directory_entry& operator=(const directory_entry&) = default;
directory_entry& operator=(directory_entry&&) noexcept = default;
void assign(const filesystem::path& p);
void assign(const filesystem::path& p, error_code& ec);
void replace_filename(const filesystem::path& p);
void replace_filename(const filesystem::path& p, error_code& ec);
void refresh();
void refresh(error_code& ec) noexcept;
const filesystem::path& path() const noexcept;
operator const filesystem::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;
strong_ordering operator<=>(const directory_entry& rhs) const noexcept;
private:
filesystem::path pathobject;
friend class directory_iterator;
};
}
A
directory_entry object stores a
path object
and may store additional objects for file attributes
such as hard link count, status, symlink status, file size, and last write time
.Implementations should store such additional file attributes
during directory iteration if their values are available
and storing the values would allow the implementation to eliminate file system accesses
by
directory_entry observer functions (
[fs.op.funcs])
. Such stored file attribute values are said to be
cached.[
Note 1:
Friendship allows the
directory_iterator implementation to cache
already available attribute values
directly into a
directory_entry object
without the cost of an unneeded call to
refresh(). —
end note]
[
Example 1:
using namespace std::filesystem;
for (auto&& x : directory_iterator("."))
{
std::cout << x.path() << " " << x.last_write_time() << std::endl;
}
for (auto&& x : directory_iterator("."))
{
lengthy_function(x.path());
x.refresh();
std::cout << x.path() << " " << x.last_write_time() << std::endl;
}
On implementations that do not cache the last write time,
both loops will result in a potentially expensive call
to the
std::filesystem::last_write_time function
. On implementations that do cache the last write time,
the first loop will use the cached value and so
will not result in a potentially expensive call
to the
std::filesystem::last_write_time function
. The code is portable to any implementation,
regardless of whether or not it employs caching
. —
end example]