【发布时间】:2014-07-09 14:25:49
【问题描述】:
我需要使用 kernel32.dll 读取文件。我已经阅读过 CreateFile、SetFilePointer 和 ReadFile 方法(我需要使用它们)——但不确定如何应用它们。
正如at msdn 提到的,我需要指定所有这些参数。我知道第一个是文件路径,但不知道其他参数是什么以及我应该以什么方式插入它们。
谁能帮助我了解有关 kernel32.dll CreateFile、SetFilePointer 和 ReadFile 的“howto”。
非常感谢任何帮助。
更新
我尝试使用 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 浏览 1 Gb 文件大约需要 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 模块会增加阅读时间?
【问题讨论】:
-
你认为闪存驱动器不使用文件系统吗?
-
您是在尝试访问驱动器上的原始字节还是寻找文件中的某个位置(如果是原始的,那么我不确定高级接口是否会有所帮助)。如果在文件中,则坚持使用 python 代码。底层文件访问可能是基于 C 的,并且与您将获得的速度差不多,而无需使用较低级别的语言。还有你拇指驱动器上的文件系统是什么?
-
文件系统为 FAT32。这是我想要做的:我有原始字节的二进制文件。我需要在每个集群的开始处寻找,读取标题并保存它。尝试用 C 编写 reading 值得一试吗?