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

获取Windows上Python的最后更改时间,python,windows,ctypes,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)

我有两个脚本,一个在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
是一个浮点数,当我将它相乘并转换为long时,我会丢失精度——通常误差小于10(即小于1毫秒)。当然,我可以修改我的程序,使其在这个精度范围内比较数字,但我更愿意使用相同的数字

这里有一个类似的问题:据我所知,我必须访问结构文件_BASIC_INFORMATION(),但是如果不使用IronPython、PyWin或类似的Python扩展,我不知道如何做到这一点。是否有一种简单的方法(可能使用
ctypes
)来访问此信息


*Windows文件时间是一个64位值,表示自公元1601年1月1日午夜12:00(C.E.)协调世界时(UTC)以来经过的100纳秒间隔数。请参见

因此,以方便任何有此问题的人。事实上,我提到的问题有点误导,因为它提到了一个模糊的驱动程序只访问函数
ZwQueryInformationFile
,而您可以使用普通的
GetFileTime
函数。无论哪种方式,这些函数都需要文件句柄,而这反过来又需要调用
CreateFile
CloseHandle
,对于大量文件(在我的例子中大约是一百万个),这是相当昂贵的。所以最后我使用了只需要路径的
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
从ctypes导入Windell、结构、byref
从ctypes.wintypes导入LPWSTR、DWORD、FILETIME
类WIN32_文件_属性_数据(结构):
_字段\=[(“dwFileAttributes”,DWORD),
(“ftCreationTime”,FILETIME),
(“ftLastAccessTime”,FILETIME),
(“ftLastWriteTime”,FILETIME),
(“nFileSizeHigh”,德沃德),
(“nFileSizeLow”,德沃德)]
文件名='路径和文件名'
wfad=WIN32_文件_属性_数据()
GetFileExInfo标准=0
GetFileAttributesExW(LPWSTR(文件名),getFileExInfo标准,byref(wfad))
lowtime=long(wfad.ftLastWriteTime.dwlowtatetime)
hightime=long(wfad.ftLastWriteTime.dwHighDateTime)
filetime=(hightime)