我有两个脚本,一个在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
答案 0 :(得分:0)
所以,为了这个问题的任何人的利益。实际上,事实证明我提到的问题How do I get *change* file time in Windows?有点误导,因为它提到了一个模糊的驱动程序只访问函数/opt/anaconda3/pkgs/python-3.5.2-0.tar.bz2
,而有一个简单的ZwQueryInformationFile
函数你可以使用。无论哪种方式,这些函数都需要文件句柄,而这又需要调用GetFileTime
和CreateFile
以及大量文件(在我的情况下大约一百万),这是非常昂贵的。所以最后我用CloseHandle
只需要路径。通过我的测量,这仍然比GetFileAttributesExW
慢一点(约10%),我认为这是通过os.stat
调用函数的开销。
因此,在从互联网上复制粘贴之后,我将以下代码放在一起,完全符合我的要求。
ctypes