使用kernel32.dll读取文件(Python)

0 投票
1 回答
2682 浏览
提问于 2025-04-18 12:38

我需要用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(也就是文件内容存放的地方),而 byrefpointer 用于 lpNumberOfBytesRead

你也可以使用 pywin32,我相信这会更简单。

希望这些对你有帮助。

撰写回答