在Windows上获取Python的最后更改时间

时间:2016-07-21 15:28:47

标签: python windows ctypes

我有两个脚本,一个在Python中,一个在Powershell中,用于获取和比较文件的最后修改。 Powershell中的一个使用:

$t = $f.LastWriteTime.ToFileTimeUtc()

这次是我的主要时间,我需要在Python中获取相同的信息。我正在使用os.stat并使用以下公式将UNIX时间戳转换为' Windows文件时间' *:

statinfo = os.stat(file_name)
t = long(statinfo.st_mtime * 10000000L) + 11644473600L * 10000000L

但是,我遇到了舍入错误的问题。 st_mtime是一个浮点数,当我将它乘以并转换为长时,我正在失去精度 - 通常误差小于10(即小于1毫秒)。我当然可以修复我的程序,以便比较这个精度范围内的数字,但我更愿意使用相同的数字。

在这里有一个类似的问题:How do I get *change* file time in Windows?我从中收集我必须访问结构FILE_BASIC_INFORMATION(http://msdn.microsoft.com/en-us/library/windows/hardware/ff545762(v=vs.85).aspx),但是我不知道如何在不使用IronPython的情况下执行此操作, PyWin或类似的Python扩展。是否有一种简单的方法(可能使用ctypes)来访问此信息?

* Windows文件时间是一个64位值,表示自公元1601年1月1日午夜12点(美国东部标准时间)协调世界时(UTC)以来经过的100纳秒间隔的数量。见https://msdn.microsoft.com/en-us/library/system.datetime.tofiletimeutc(v=vs.110).aspx

1 个答案:

答案 0 :(得分:0)

所以,为了这个问题的任何人的利益。实际上,事实证明我提到的问题How do I get *change* file time in Windows?有点误导,因为它提到了一个模糊的驱动程序只访问函数/opt/anaconda3/pkgs/python-3.5.2-0.tar.bz2,而有一个简单的ZwQueryInformationFile函数你可以使用。无论哪种方式,这些函数都需要文件句柄,而这又需要调用GetFileTimeCreateFile以及大量文件(在我的情况下大约一百万),这是非常昂贵的。所以最后我用CloseHandle只需要路径。通过我的测量,这仍然比GetFileAttributesExW慢一点(约10%),我认为这是通过os.stat调用函数的开销。

因此,在从互联网上复制粘贴之后,我将以下代码放在一起,完全符合我的要求。

ctypes