文件时间

文件时间 是一个 64 位值,表示自 1601 年 1 月 1 日凌晨 12:00 A.M. 起经过的 100 纳秒间隔数(UTC)。 系统记录应用程序创建、访问和写入文件时的文件时间。

NTFS 文件系统以 UTC 格式存储时间值,因此不受时区或夏令时更改的影响。 FAT 文件系统基于计算机的本地时间存储时间值。 例如,在华盛顿的 PST 下午 3:00 保存的文件在 NTFS 卷上被视为 NTFS 卷的 EST 下午 6:00,但在 FAT 卷上,它被视为纽约 EST 下午 3:00。

时间戳会因各种原因而更新。 文件时间戳的唯一保证是文件时间在关闭进行更改的句柄时正确反映。

并非所有文件系统都可以记录创建和上次访问时间,并非所有文件系统都以相同的方式记录它们。 例如,在 FAT 上创建时间的分辨率为 10 毫秒,而写入时间的分辨率为 2 秒,访问时间的分辨率为 1 天,因此确实是访问日期。 NTFS 文件系统在上次访问后最多 1 小时延迟对文件的上次访问时间的更新。

若要检索指定文件的文件时间,请使用 GetFileTime 函数。 GetFileTime 将创建、上次访问和上次写入时间复制到单个 FILETIME 结构。 还可以使用 FindFirstFileFindNextFile 函数检索文件时间。 这些函数将文件时间复制到 WIN32_FIND_DATA 结构中 FILETIME 结构。 写入文件时,在关闭用于写入的所有句柄之前,最后一次写入时间不会完全更新。

若要设置文件的文件时间,请使用 SetFileTime 函数。 此函数允许修改创建、上次访问和上次写入时间,而无需更改文件的内容。 可以使用 CompareFileTime 函数来比较不同文件的时间。 该函数比较两个文件时间,并返回一个值,该值指示时间晚于或返回 0(零)(如果时间相等)。

如果计划修改指定文件的文件时间,则可以使用 SystemTimeToFileTime 函数将日期和时间转换为文件时间。 还可以通过调用 GetSystemTimeAsFileTime 函数,在 FILETIME 结构中获取系统时间。

若要让用户轻松显示文件时间,请使用 FileTimeToSystemTime 函数。 FileTimeToSystemTime 将文件时间从文件时间复制到 SYSTEMTIME 结构,并将月份、日、年和日时间复制到一天中。

文件时间和夏令时

如果用户已将系统设置为自动调整夏令时,则必须小心使用文件时间。

若要将文件时间转换为本地时间,请使用 FileTimeToLocalFileTime 函数。 但是,FileTimeToLocalFileTime 使用时区和夏令时的当前设置。 因此,如果是夏令时,即使转换的文件时间是标准时间,也需要考虑到夏令时。

FAT 文件系统在本地时间记录磁盘上的时间。 GetFileTime 从 FAT 文件系统检索缓存的 UTC 时间。 当它变为夏令时时,GetFileTime 检索的时间将关闭一小时,因为缓存不会更新。 重新启动计算机时,GetFileTime 检索的缓存时间是正确的。 FindFirstFile 从 FAT 文件系统检索本地时间,并使用时区和夏令时的当前设置将其转换为 UTC。 因此,如果是夏令时,FindFirstFile 考虑夏令时,即使转换的文件时间是标准时间。

NTFS 文件系统以 UTC 格式记录磁盘上的时间。 若要考虑将文件时间转换为本地时间时的夏令时,请使用以下函数序列,而不是使用 FileTimeToLocalFileTime

文件时间和 CDFS

使用光盘文件系统(CDFS)定位或源自媒体的文件的日期和时间戳已针对本地时区进行调整。 ISO 9660 指出 CDFS 将正确显示本地时区的日期信息。 这样做是为了使 CDFS 上的文件日期与通用磁盘格式(UDF)上的文件显示日期相同。 UDF 是分发媒体的较新标准。 如果代码依赖于驻留在媒体上使用 CDFS 或源自媒体的未修改日期信息,则它可能无法正常工作。