c++oding="utf-8" ?>
std::filesystem::directory_entry可直接调用status()、file_size()、last_write_time()、path()等成员函数获取类型权限、大小、修改时间及路径;其中file_size()仅对常规文件有效,否则抛异常,需先用is_regular_file()判断。

std::filesystem::directory_entry能直接读取哪些属性
std::filesystem::directory_entry 本身不“存储”属性,它只是一个轻量级句柄,指向路径并缓存部分元数据(取决于构造方式)。调用 status()、file_size()、last_write_time() 等成员函数时,才触发实际系统调用——但若构造时用了 symlink_status 或启用了缓存(如通过 directory_iterator 的默认行为),可能复用已获取的信息。
常见可直接调用的属性访问函数包括:
-
status():返回file_status,含类型(regular_file、directory等)和权限(permissions) -
file_size():仅对常规文件/符号链接目标有效;对目录或特殊文件会抛std::filesystem::filesystem_error -
last_write_time():返回file_time_type,注意 Windows 和 POSIX 的精度差异(Windows 通常为 100ns,POSIX 多为 1s 或 1ns,取决于文件系统) -
path():返回封装的std::filesystem::path,非属性但常用于后续操作
为什么file_size()经常抛异常
根本原因:不是所有路径都对应可报告大小的实体。比如目录、FIFO、设备节点、损坏的符号链接,file_size() 会失败。
典型错误信息是:std::filesystem::filesystem_error: filesystem error: cannot determine file size。
安全做法是先判断类型再取大小:
if (entry.status().type() == std::filesystem::file_type::regular_file) {
try {
auto size = entry.file_size();
// 使用 size
} catch (const std::filesystem::filesystem_error& e) {
// 处理异常(例如权限不足)
}
}
更稳妥的方式是用 std::filesystem::is_regular_file(entry) 替代 status().type() 判断,它内部会处理符号链接解析逻辑。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
directory_entry构造方式影响性能和行为
构造方式决定是否预加载元数据,直接影响后续属性访问是否需额外系统调用:
- 直接构造:
std::filesystem::directory_entry{"/path"}—— 不预加载任何信息,首次调用status()或file_size()才查系统 - 配合
directory_iterator构造(默认):for (auto& entry : std::filesystem::directory_iterator{dir})—— 迭代器内部通常已调用stat(),entry.status()等基本属性基本不触发新系统调用 - 显式缓存:
std::filesystem::directory_entry{p, std::filesystem::symlink_status(p)}—— 提前指定状态,避免重复查询,适合需多次访问同一路径场景
注意:不同标准库实现(libstdc++ vs libc++)对缓存策略有差异,不要假设 directory_entry 总是“惰性”或“ eager”。生产环境建议用 directory_iterator 遍历 + 显式检查类型,平衡可读性与效率。
权限和符号链接处理容易忽略的细节
status() 和 symlink_status() 返回结果不同:
-
status()解引用符号链接,返回目标文件的状态(如果目标存在且可访问) -
symlink_status()返回符号链接自身的状态(即使目标不存在)
权限字段(permissions())在符号链接上总是返回 perms::none(除非底层 OS 支持 symlink 权限,如某些 Linux 内核配置,但 C++ 标准不保证)。
要判断是否为符号链接,用 is_symlink(entry.symlink_status()),而非 is_symlink(entry.status()) —— 后者可能因目标不可达而抛异常或返回错误类型。
跨平台时尤其注意:Windows NTFS 的 ACL 不通过 permissions() 暴露,该字段只映射基础的读/写/执行位(owner_read 等),且执行位在 Windows 上无意义。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










