我试图在python中使用ctypes
创建一个新文件。文件被创建了,我可以写进去。当我试图从这个文件中读取时,问题就开始了。它给我一个无效的文件句柄错误。任何人都知道为什么会这样。在
以下是我使用的代码:
from ctypes import *
def CreateFile(file_name='',data=''):
file_handler=windll.Kernel32.CreateFileA(file_name,0x10000000,0,None,4,0x80,None)
pointer_to_written_data=c_int(0)
windll.Kernel32.WriteFile(file_handler,data,len(data),byref(pointer_to_written_data),None)
windll.Kernel32.CloseHandle(file_handler)
return
def ReadAFile(file_name=''):
file_handler=windll.Kernel32.CreateFileA(file_name,0x10000000,0,None,4,0x80,None)
data=create_string_buffer(4096)
pointer_to_read_data=c_int(0)
if(windll.Kernel32.ReadFile(file_handler,byref(data),1024,byref(pointer_to_read_data),None)==0):
print "Failed"
print windll.Kernel32.GetLastError()
windll.Kernel32.CloseHandle(file_handler)
print data.value
return
CreateFile("sample.txt","This is a test file!!")
ReadAFile("sample.txt")
您的代码在CloseHandle编辑之后仍然正常工作。在
当您不关闭
CreateFile()
中的文件句柄时,ReadAFile
中打开的文件失败,因为该文件已经打开。您没有检查错误,因此对ReadFile
的调用失败。现在代码被编辑为在CreateFile
中有CloseHandle
,它就可以工作了。注意,您可能需要关闭并重新打开IDE,因为它可能会使文件的句柄保持打开状态,直到您终止进程为止,因为这是一个句柄泄漏(我遇到过这个问题)。在我还发现在ctypes中显式定义}是有用的。
argtypes
、restype
和{errcheck
尤其是,因为代码会抛出一个错误,您不必检查返回值是否失败。在相关问题 更多 >
编程相关推荐