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

2024-03-28 16:44:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

$t = $f.LastWriteTime.ToFileTimeUtc()

这一次对我来说是主要的,我需要在Python中获得相同的信息。{I{I>使用以下公式将时间戳转换为

^{pr2}$

但是,我遇到了舍入错误的问题。st_mtime是一个浮点数,当我将它乘以并转换为long时,我将失去精度——通常误差小于10(即小于1毫秒)。我当然可以修改我的程序,这样它就可以在这个精度内比较数字,但我更希望使用相同的数字。在

这里有一个类似的问题:How do I get *change* file time in Windows?我从中收集到必须访问结构文件_基本信息(http://msdn.microsoft.com/en-us/library/windows/hardware/ff545762(v=vs.85).aspx),但是我不确定如何在不使用IronPython、PyWin或类似的Python扩展的情况下完成它。有没有一种简单的方法(也许使用ctypes)来访问这些信息?在

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


Tags: 文件脚本com信息windowslibrary时间精度
1条回答
网友
1楼 · 发布于 2024-03-28 16:44:11

所以,为了任何有这个问题的人的利益。事实上,我提到的问题How do I get *change* file time in Windows?有点误导,因为它提到了一个模糊的只访问驱动程序的函数ZwQueryInformationFile,而你可以使用普通的GetFileTime函数。不管怎样,这些函数都需要文件句柄,而这又需要调用CreateFile和{},对于大量的文件(在我的例子中大约有一百万个),这是相当昂贵的。所以最后我使用了GetFileAttributesExW,它只需要路径。根据我的测量,这仍然比os.stat慢一点(大约10%),我认为这是由于通过ctypes调用函数的开销造成的。在

所以在从网上复制粘贴后,我把下面的代码放在一起,这正是我想要的。在

from ctypes import windll, Structure, byref
from ctypes.wintypes import LPWSTR, DWORD, FILETIME

class WIN32_FILE_ATTRIBUTE_DATA(Structure):
    _fields_ = [("dwFileAttributes", DWORD),
                ("ftCreationTime", FILETIME),
                ("ftLastAccessTime", FILETIME),
                ("ftLastWriteTime", FILETIME),
                ("nFileSizeHigh", DWORD),
                ("nFileSizeLow", DWORD)]

filename = 'path and file name'

wfad = WIN32_FILE_ATTRIBUTE_DATA()
GetFileExInfoStandard = 0
windll.kernel32.GetFileAttributesExW(LPWSTR(filename), GetFileExInfoStandard, byref(wfad))
lowtime = long(wfad.ftLastWriteTime.dwLowDateTime)
hightime = long(wfad.ftLastWriteTime.dwHighDateTime)
filetime = (hightime << 32) + lowtime
print filetime

相关问题 更多 >