使用kernel32.dll读取文件(Python)
我需要用kernel32.dll来读取文件。我了解了CreateFile、SetFilePointer和ReadFile这些方法(我需要用到它们),但不太清楚怎么使用。
正如在msdn上提到的,我需要指定所有这些参数。我知道第一个是文件的路径,但对其他参数是什么以及该怎么填完全没头绪。
有没有人能帮我解释一下如何使用kernel32.dll的CreateFile、SetFilePointer和ReadFile?
非常感谢任何帮助。
更新
我之所以想用kernel32,是因为我需要一种非常快速的方式来从闪存驱动器读取数据。我需要一种能直接从闪存读取的方法,而不想在文件系统中浪费时间。我的意思是直接访问所需的字节,而不是在文件系统中进行长时间的搜索。
这是我用来读取的代码:
index = 524288
data = open('Path-to-file', 'rb')
while index < file_length:
data.seek(index)
headers.append((index, data.read(128)))
index += cluster
data.close()
这段代码在通过USB读取1GB的文件时大约需要8分钟。
我希望能在4分钟内完成。
如果有人有其他方法可以做到这一点,我会非常感激。
更新
我尝试过使用win32file(pywin32),代码如下:
def get_headers(self):
while self.index < self.file_len:
handle = win32file.CreateFile(self.path, win32file.GENERIC_READ,
win32file.FILE_SHARE_READ, None,
win32file.OPEN_EXISTING,
win32file.FILE_ATTRIBUTE_NORMAL, None)
win32file.SetFilePointer(handle, self.index, win32file.FILE_CURRENT)
header_ = win32file.ReadFile(handle, 128, None)
header = header_[1]
self.headers.append((self.index, header))
self.index += cluster
win32file.CloseHandle(handle)
但这比Python的“seek”和“read”函数还要花更多时间(12分钟)。有没有人知道为什么使用Windows的dll模块会增加读取时间?
1 个回答
0
这里是使用 CreateFile
的最常见方式:
hFile = CreateFile("file.txt", GENERIC_READ, 0, 0, 3, 128, None)
还有 ReadFile
:
ReadFile(hFile, pOutput, nNumberOfBytesToRead, lpNumberOfBytesRead, 0)
需要注意的是,如果你使用 ctypes,你需要用 c_char_p
(它代表一个字符串)来处理 pOutput
(也就是文件内容存放的地方),而 byref
或 pointer
用于 lpNumberOfBytesRead
。
你也可以使用 pywin32,我相信这会更简单。
希望这些对你有帮助。