获取文件创建时间(以毫秒为单位)


13

有没有一种方法可以更准确地获取Windows中文件的创建时间?我想以毫秒为单位获取mp4视频的创建时间。这可能吗?


我不得不问你为什么需要这种准确性?
摩押

1
我将一些传感器数据与视频一起记录在Android设备上。我自己编写了传感器日志记录,并与每个传感器值一起记录了系统时间。为了录制视频,我使用标准的摄像机活动。将数据发送到PC后,我想对其进行分析。为了将视频与传感器数据合并,我必须知道视频何时开始。秒有点过于粗略,因此我正在寻找一种方法来获取更准确的视频开始时间。
Phil

3
注意:如果需要在两个数据流之间建立这种关系,通常必须在流中放置一个注册信号(例如电影中导演使用的旧隔板称为“动作”。该隔板是视觉提示和音频提示)提示,允许稍后同步两个或多个流)。在某些情况下,在内核模式下创建文件(与记录时间戳)与唤醒进程以使其知道它具有要使用的文件句柄之间的时间延迟实际上可能比数据的容忍度高。
Cort Ammon

当您将内容从Android复制到其他地方时,请确保所有复制工具都保留时间戳记精度。请注意,许多复制工具会将ctime副本作为复制的时间。
彼得·科德斯

1
在Windows上,我将使用cygwin / mingw stat来获取所有3个时间戳。当然,那是因为我通常使用GNU / Linux。
彼得·科德斯

Answers:


23

时间戳分辨率

Windows中文件的创建时间戳取决于文件系统:

  • FAT / VFAT的最大分辨率为2s

  • NTFS的最大分辨率为100 ns


WMIC解决方案

您可以使用 wmic用来将文件创建日期检索到最接近的微秒。

例:

F:\test>wmic datafile where name="f:\\test\\test.txt" get creationdate | findstr /brc:[0-9]
20150329221650.080654+060

创建日期20150329221650.080654+060是一个时间戳,格式如下:

yyyymmddHHMMSS.xxxxxxsUUU

哪里:

  • yyyy 四位数的年份(0000到9999)。

  • mm 两位数的月份(01到12)。

  • dd 每月的两位数字(01到31)。

  • HH 使用24小时制(00到23)在一天中显示两位数。

  • MM 小时中的两位数字分钟(00到59)。

  • SS 分钟中的两位秒数(00到59)。

  • xxxxxx 秒中的六位微秒数(000000至999999)

  • s加号(+)或减号(-)表示与世界标准时间(UTC)的正或负偏移。

  • UUU 三位数的偏移量,指示始发时区偏离UTC的分钟数。


统计解决方案

您也可以使用stat(从cygwinmingw安装)。

例:

DavidPostill@Hal /f/test
$ stat test.txt | grep Birth
 Birth: 2015-03-29 22:16:50.080654200 +0100

dir输出以进行比较

F:\test>dir /t:c test.txt
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/03/2015  22:16                32 test.txt
               1 File(s)             32 bytes
               0 Dir(s)  1,798,546,849,792 bytes free

进一步阅读


@NateEldredge谢谢,发现得很好。答案已更正。
DavidPostill

4
注意事项:仅因为时间戳包含一个高频数字(例如100纳秒的数字),并不意味着该时钟可以用作100ns范围内的可靠时间源。它只是说有很多内容是[希望]单调的,并且与“实时”大致相关。
Cort Ammon

1
请参阅msdn CIM_DATETIME:用您的符号表示,xxxxxx秒的六位数微秒(000000到999999),即10^-6。当然,第一个三元组代表mili-10^-3):被截断而不是四舍五入。提取的第二个三元组本身不代表任何内容 ...但是,某些wmi日期时间值000始终显示第二个三元组,例如wmic OS get LocalDateTime
JosefZ 2015年

1
谢谢,这些答案就是为什么我喜欢堆栈交换的原因:)
Phil

1
@MarisB。啊。答案已更新。
DavidPostill


1

我在Matlab中找到了一种获取方法:

您可以使用Jan Simon编写的GetFileTime函数。如果您不想编译自己的mex文件,也可以在此处下载已编译的文件。

它不像使用wmic(仅用于ms)那样精确,但就我的目的而言,它是合适的。


-3

取决于文件系统:FAT具有2秒的分辨率,NTFS 理论上具有100 ns的分辨率,但实际分辨率为10 ms。也就是说,中断的优先级高于磁盘I / O,并且我不确定写缓存对时间戳的影响。多媒体计时器针对准确性进行了优化,因此将是实现计时的首选方法。

您可以使用XYplorer之类的现有工具来查看高分辨率时间戳,或者XYplorer显示毫秒,您可能更喜欢编写自己的应用程序。使用File.GetCreationTime方法;它返回具有毫秒属性的DateTime结构


1
嗯...不客气,但是,您读过@DavidPostill的答案吗?
td512

2
“ NTFS理论上具有100 ns的分辨率,但实际分辨率为10 ms ”是不正确的 -该链接实际上说“ 在NT FAT上,创建时间的分辨率为10毫秒”。这确实不是意味着NTFS有分辨率。您可以从我的回答中看到,在NTFS上wmic显示的分辨率接近最近的微秒
DavidPostill

理论分辨率和最大分辨率之间存在差异,一个表示最大分辨率,另一个表示平均分辨率。
Ramhound

1
@DavidPostill如果时钟仅每10毫秒增加一次时间,则归档一个可以表示100 ns的日期时间仍然只有10毫秒的精度。典型的UtcNow API(与用于测量时间差的高性能计数器相对)在Windows上每0.5-16ms增加一次时间,因此这个答案很合理。
CodesInChaos

@CodesInChaos是,但是-“获取系统时间的最佳资源是GetSystemTimeAsFileTime API。它是一种快速访问API,能够在其参数中保留足够准确的值(100 ns单位)。” -我无权访问Windows源代码,所以我不知道在处理文件时间戳时会在后台使用什么调用。我们不知道实际的分辨率是多少,这只是猜测。
DavidPostill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.