Windows用GetFileTime获取创建/修改时间需先CreateFile打开文件并检查返回值,创建时间在NTFS可靠而FAT32仅存日期;POSIX无创建时间概念,st_ctim为状态更改时间,Linux 5.1+ statx或macOS stat可有条件获取birth time;C++17 std::filesystem::last_write_time仅支持修改时间,不提供跨平台创建时间接口。

Windows 下用 GetFileTime 获取创建/修改时间(最常用)
在 Windows 平台,GetFileTime 是获取文件创建、最后访问、最后修改三个时间戳的标准 API。它返回的是 FILETIME 结构(64 位,单位为 100 纳秒,自 1601-01-01 UTC 起),需转换为本地可读时间。
关键点:
-
GetFileTime需要先用CreateFile打开文件(哪怕只用GENERIC_READ权限),不能直接传路径字符串 - 必须检查返回值:函数失败时返回 0,且
GetLastError()可能为ERROR_ACCESS_DENIED(比如对目录或某些系统文件) - 创建时间(
lpCreationTime)在 NTFS 上可靠,但 FAT32 仅保留日期,时间部分恒为 00:00:00
示例片段:
HANDLE h = CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
FILETIME ftCreate, ftModify;
if (h != INVALID_HANDLE_VALUE && GetFileTime(h, &ftCreate, nullptr, &ftModify)) {
SYSTEMTIME st;
FileTimeToSystemTime(&ftCreate, &st); // 转为年月日时分秒
printf("Created: %04d-%02d-%02d %02d:%02d:%02d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
CloseHandle(h);
Linux/macOS 下用 stat 或 statx 获取 st_ctim 和 st_mtim
POSIX 系统没有“创建时间”概念,stat 的 st_ctim 是“状态更改时间”(如权限、所有者变更),不是 Windows 意义上的创建时间;st_mtim 对应修改时间,是可靠的。
立即学习“C++免费学习笔记(深入)”;
注意:
-
st_ctim≠ 创建时间 —— 多数 Linux 文件系统(ext4/xfs)不记录真实创建时间,stat -c "%w" file显示为空或“-” - Linux 5.1+ 支持
statx(),若挂载时启用了inode_v2(如 btrfs、XFS),可能通过statx.stx_btime拿到 birth time,但需显式检查STATX_BTIME标志是否被置位 - macOS 的
stat有st_birthtimespec字段(通过stat -f "%SB" file可见),但 C++ 中需用struct stat+st_birthtimespec.tv_sec访问
C++17 std::filesystem::last_write_time 能否拿到创建时间?
不能。std::filesystem::last_write_time 只封装了平台的“最后修改时间”,对应 Windows 的 ftLastWriteTime 或 POSIX 的 st_mtim。C++ 标准库至今(C++23)未定义“创建时间”的跨平台接口。
如果你写跨平台代码:
- 依赖
last_write_time是安全的,它在所有支持std::filesystem的平台都有效 - 想取创建时间?只能条件编译:
#ifdef _WIN32走GetFileTime,#else默认忽略或 fallback 到last_write_time(并加注释说明) - 别试图用
std::filesystem::status或symlink_status补充创建时间字段 —— 它们不提供该信息
为什么 _file_time_type 不是标准 C++ 接口?
_file_time_type 是 MSVC 私有扩展类型(定义在 xtree 或 filesystem 内部头中),用于实现 std::filesystem::file_time_type 的底层时间表示,**不是供用户直接使用的 API**。它通常映射为 std::chrono::file_clock::time_point,而该时钟在 Windows 上基于 FILETIME,在 Linux 上则模拟为 system_clock 偏移量。
常见误用:
- 试图用
std::filesystem::file_time_type构造函数传入FILETIME—— 编译失败,类型不兼容 - 把
_file_time_type当作公开类型写进头文件 —— 会导致跨编译器(Clang/GCC)或跨 MSVC 版本不可移植 - 期望
file_time_type在所有平台都能 round-trip 到真实创建时间 —— 实际上它只保证与last_write_time语义一致,不承诺对应磁盘元数据中的哪个字段
真正需要创建时间的场景,绕不开平台特定调用;标准库只负责把“修改时间”这件事做得尽量统一。



















