使用ctypes创建的文件处理程序无效

2024-09-23 10:34:53 发布

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

我试图在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")

Tags: 文件tonamenonedatadefctypesfile
1条回答
网友
1楼 · 发布于 2024-09-23 10:34:53

您的代码在CloseHandle编辑之后仍然正常工作。在

当您不关闭CreateFile()中的文件句柄时,ReadAFile中打开的文件失败,因为该文件已经打开。您没有检查错误,因此对ReadFile的调用失败。现在代码被编辑为在CreateFile中有CloseHandle,它就可以工作了。注意,您可能需要关闭并重新打开IDE,因为它可能会使文件的句柄保持打开状态,直到您终止进程为止,因为这是一个句柄泄漏(我遇到过这个问题)。在

我还发现在ctypes中显式定义argtypesrestype和{}是有用的。errcheck尤其是,因为代码会抛出一个错误,您不必检查返回值是否失败。在

from ctypes import *
from ctypes import wintypes as w

INVALID_HANDLE_VALUE = w.HANDLE(-1).value
GENERIC_ALL = 0x10000000
OPEN_ALWAYS = 4
FILE_ATTRIBUTE_NORMAL = 0x80

_k32 = WinDLL('kernel32',use_last_error=True)
_CreateFileA = _k32.CreateFileA
_WriteFile = _k32.WriteFile
_ReadFile = _k32.ReadFile
_CloseHandle = _k32.CloseHandle

def validate_handle(result,func,args):
    if result == INVALID_HANDLE_VALUE:
        raise WindowsError(get_last_error())
    return result

def validate_bool(result,func,args):
    if not result:
        raise WindowsError(get_last_error())

_CreateFileA.argtypes = w.LPCSTR,w.DWORD,w.DWORD,c_void_p,w.DWORD,w.DWORD,w.HANDLE
_CreateFileA.restype = w.HANDLE
_CreateFileA.errcheck = validate_handle
_WriteFile.argtypes = w.HANDLE,c_void_p,w.DWORD,POINTER(w.DWORD),c_void_p
_WriteFile.restype = w.BOOL
_WriteFile.errcheck = validate_bool
_ReadFile.argtypes = w.HANDLE,w.LPVOID,w.DWORD,POINTER(w.DWORD),c_void_p
_ReadFile.restype = w.BOOL
_ReadFile.errcheck = validate_bool
_CloseHandle.argtypes = w.HANDLE,
_CloseHandle.restype = w.BOOL
_CloseHandle.errcheck = validate_bool

def CreateFile(file_name='',data=''):
    file_handler = _CreateFileA(file_name,GENERIC_ALL,0,None,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,None)
    written = w.DWORD()
    try:
        _WriteFile(file_handler,data,len(data),byref(written),None)
    finally:
        _CloseHandle(file_handler)

def ReadAFile(file_name=''):
    file_handler = _CreateFileA(file_name,GENERIC_ALL,0,None,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,None)
    data = create_string_buffer(4096)
    read = w.DWORD()
    try:
        _ReadFile(file_handler,byref(data),1024,byref(read),None)
    finally:
        _CloseHandle(file_handler)
    print data.value

CreateFile("sample.txt","This is a test file!!")
ReadAFile("sample.txt")

相关问题 更多 >