getfiletime 返回1601-01-01是因为文件句柄缺少file_read_attributes权限;需用createfile显式申请该权限,再经filetimetolocalfiletime和filetimetosystemtime转换才能正确显示时间。

GetFileTime 为什么返回的创建时间总是 1601-01-01?
直接调用 GetFileTime 却拿到一个“零时间”(FILETIME 全 0,对应 1601-01-01 00:00:00),大概率是因为没正确打开文件句柄——Windows 要求句柄必须带有 FILE_READ_ATTRIBUTES 权限才能读取时间戳,而很多人用 CreateFile 时只传了 GENERIC_READ 或干脆漏掉权限参数。
实操建议:
- 用
CreateFile打开文件时,dwDesiredAccess必须显式包含FILE_READ_ATTRIBUTES(即使你只是想读时间,不读内容) - 不要用
GENERIC_READ替代:它在某些文件系统或重定向场景下不等价于FILE_READ_ATTRIBUTES - 检查
CreateFile返回值是否为INVALID_HANDLE_VALUE,并用GetLastError()确认是否是ERROR_ACCESS_DENIED
FILETIME 怎么转成可读的年月日时分秒?
GetFileTime 填充的是 FILETIME 结构(64 位整数,单位是 100 纳秒,起点是 1601-01-01 UTC),不能直接 printf。必须先转成 SYSTEMTIME 才能提取年、月、日等字段。
关键步骤:
- 调用
FileTimeToLocalFileTime(可选,但推荐):把 UTC 时间转成本地时区,避免夏令时/时区偏差 - 再调用
FileTimeToSystemTime,得到SYSTEMTIME结构 -
wYear、wMonth、wDay等字段就是你要的整数,注意wMonth是 1~12,不是 0~11
示例片段:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
FILETIME ftCreate, ftAccess, ftWrite;
if (GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite)) {
FILETIME ftLocal;
if (FileTimeToLocalFileTime(&ftCreate, &ftLocal)) {
SYSTEMTIME st;
if (FileTimeToSystemTime(&ftLocal, &st)) {
printf("Created: %04d-%02d-%02d %02d:%02d:%02d\n",
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond);
}
}
}
用 FindFirstFile 获取创建时间更简单?
如果只是查单个文件(非遍历目录),FindFirstFile 确实比 CreateFile + GetFileTime 少两步调用,而且它返回的 WIN32_FIND_DATA 里自带 ftCreationTime 字段。
但要注意:
-
FindFirstFile的路径参数必须是完整路径(含驱动器或相对路径有效),通配符如"*.txt"会匹配失败 - 它对符号链接、挂载点、重解析点行为不一致,有时返回的是链接本身的创建时间,而非目标文件
- 若文件被其他进程独占打开(如 Excel 正在编辑 .xlsx),
FindFirstFile仍能成功;但CreateFile可能失败——这点要看你的容错需求
为什么 GetFileTime 在 NTFS 上准,在 FAT32 上不准?
FAT32 文件系统本身不存储“创建时间”,只存“最后写入时间”和“最后访问时间”。Windows 在 FAT32 上模拟创建时间:首次写入时记录当前时间,之后不再更新。这意味着:
- 复制文件到 FAT32 盘,创建时间 = 复制时刻(不是源文件原始创建时间)
- 移动文件(同盘),创建时间可能被清零或保留旧值,行为不稳定
- 如果程序依赖创建时间做逻辑判断(比如“只处理今天创建的文件”),在 FAT32 上极易出错
检查方法:用 fsutil fsinfo volumeinfo X:\ 看文件系统类型;生产环境若需可靠时间戳,应优先使用 NTFS 或改用最后写入时间(ftLastWriteTime)作为替代依据。
真正麻烦的不是 API 怎么调,而是得时刻记住:你拿到的那个“创建时间”,到底是磁盘记的、系统填的、还是根本没记。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










