std::filesystem::last_write_time 不是创建时间,C++17 标准未定义 creation_time;Windows 需用 GetFileInformationByHandle 提取 ftCreationTime,Linux/macOS 缺乏可靠支持,跨平台无标准解法。

std::filesystem::last_write_time 是唯一标准接口
标准 C++17 std::filesystem **不提供获取文件创建时间(birth time)的可移植接口**。所有主流实现(libstdc++、libc++、MSVC STL)都只保证 last_write_time 可用,last_access_time 和 creation_time 在标准中未定义,且实际行为因平台而异。
你看到某些示例调用 status(path).permissions() 或尝试访问 file_time_type 成员,并不能反推出创建时间 —— 这是常见误解。
Windows 上可用 std::filesystem::last_write_time 替代?不行
在 Windows,NTFS 文件系统确实记录了创建时间(FILETIME 中的 ftCreationTime),但 MSVC 的 std::filesystem::last_write_time 返回的是最后写入时间,不是创建时间;而且其底层调用 GetFileInformationByHandle 后只提取了 ftLastWriteTime,完全忽略 ftCreationTime。
如果你硬要获取 Windows 创建时间,必须绕过 std::filesystem:
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
WIN32_FIND_DATA+FindFirstFileW,读取ftCreationTime - 或用
GetFileInformationByHandle,传入打开的句柄 -
std::filesystem::path可转为wstring()供 Win32 API 使用,但无法直接从中提取 birth time
Linux/macOS 根本没有可靠 creation time
绝大多数 Linux 文件系统(ext4、XFS)默认不存储创建时间;即使较新内核支持 btime(如 XFS + kernel ≥ 4.11),glibc 和 libstdc++ 也未将其暴露给 std::filesystem。macOS 的 APFS 虽然存有 birthtime,但 libc++ 的 std::filesystem 实现仍只映射 st_mtimespec 到 last_write_time,跳过了 st_birthtimespec。
验证方式:用 stat -c '%w' /path(Linux)或 stat -f '%B' /path(macOS)能查到 birth time,但 std::filesystem::last_write_time 的返回值永远对不上这个时间戳。
跨平台方案只能放弃 std::filesystem::last_write_time
真要跨平台获取创建时间,目前没有标准库解法。可行路径只有:
- 条件编译:Windows 用
GetFileInformationByHandle,macOS 用stat+st_birthtimespec,Linux 大部分场景返回std::filesystem::file_time_type::min()并注明“不可用” - 依赖第三方库如
boost::filesystem(v1.70+ 通过boost::filesystem::status(path).creation_time()尝试封装,但实际仍受限于底层 OS 支持) - 接受现实:用
last_write_time作为近似替代,并在文档里明确说明它不是创建时间
最常被忽略的一点:即使你在 macOS 上用 stat 读到了 st_birthtimespec,它的精度可能低于 last_write_time(例如秒级而非纳秒级),而且某些挂载选项(如 NFS)会彻底丢弃该字段。

















