文件时间

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

NTFS 文件系统以 UTC 格式存储时间值,因此它们不受时区或夏令时更改的影响。 FAT 文件系统根据计算机的本地时间存储时间值。 例如,保存在华盛顿太平洋时间下午 3:00 的文件在 NTFS 卷上被视为 EST 下午 6:00,但在 FAT 卷上,它被视为 3:00 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 的媒体上或源自媒体的文件的未修改日期信息,则它可能无法正常工作。