【发布时间】:2014-08-06 16:39:32
【问题描述】:
以下代码意外引发异常:pywintypes.error: (6, 'GetFileInformationByHandle', 'The handle is invalid.'),即GetFileInformationByHandle 不起作用。
奇怪的是,在Python 调试器下一切正常。更奇怪的是,当我删除 some_parameter 或 GetFileInformationByHandle 时,错误消失了。这告诉我可能是一些内存错误,但我真的很茫然。
有些代码可能看起来是不必要的,但我不能在不引起异常的情况下进一步缩小代码。
我已经在 Windows 7、pywin32 218.5 和 219 上的 Python 3.4.1 x64 上对此进行了测试。
import os
import win32file
import pywintypes
from ctypes import *
from ctypes.wintypes import *
class BY_HANDLE_FILE_INFORMATION(Structure):
_fields_ = [
('dwFileAttributes', DWORD),
('ftCreationTime', FILETIME),
('ftLastAccessTime', FILETIME),
('ftLastWriteTime', FILETIME),
('dwVolumeSerialNumber', DWORD),
('nFileSizeHigh', DWORD),
('nFileSizeLow', DWORD),
('nNumberOfLinks', DWORD),
('nFileIndexHigh', DWORD),
('nFileIndexLow', DWORD),
]
def GetFileInformationByHandle2(handle):
GetFileInformationByHandle(handle)
def GetFileInformationByHandle(handle):
bhfi = BY_HANDLE_FILE_INFORMATION()
res = windll.kernelbase.GetFileInformationByHandle(handle.handle, byref(bhfi))
if res == 0:
errno = GetLastError()
raise pywintypes.error(errno, 'GetFileInformationByHandle', FormatError(errno))
def open_file(path, param_1=False):
return win32file.CreateFile(path, win32file.GENERIC_READ, 0, None, win32file.OPEN_EXISTING, 0, None)
def main():
path = 'test.bin'
open(path, 'wb').close()
h_file = open_file(path)
GetFileInformationByHandle(h_file)
win32file.CloseHandle(h_file)
h_file = open_file(path)
GetFileInformationByHandle2(h_file)
win32file.CloseHandle(h_file)
os.remove(path)
if __name__ == '__main__':
main()
【问题讨论】:
-
您没有指出异常发生的位置(没有堆栈跟踪)。另外,这是重现问题所需的最少代码量吗?如果您只对一个文件进行操作,并消除(看似毫无意义的)
GetFileInformationByHandle2包装函数,是否还会发生这种情况? -
是的,没有
GetFileInformationByHandle2代码有效。代码出现在raise pywintypes.error。 -
对于投了赞成票和反对票的人来说,这是最小的例子。
-
这段代码并不长。其中大约 1/3 是导入和字典,您可以在需要理解之前跳过它,尽管有趣的是该示例包括
GetFileInformationByHandle2,它只调用GetFileInformationByHandle。大声笑