【问题标题】:Read file with kernel32.dll (Python)使用 kernel32.dll (Python) 读取文件
【发布时间】: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 值得一试吗?

标签: python kernel32


【解决方案1】:

这是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用于@ 987654331@.

您也可以使用pywin32,我相信它会更简单。

希望这会有所帮助。

【讨论】:

  • 我应该如何指定CreateFile函数?我试过这个,但它不起作用:kernel = ctypes.windll.kernel32; handle = kernel.CreateFileW(self.path, kernel.GENERIC_READ, kernel.FILE_SHARE_READ, None, kernel.OPEN_EXISTING, kernel.FILE_ATTRIBUTE_NORMAL, None)
  • 应该可以。如果您使用的是CreateFileW,请确保self.path 是一个unicode 字符串。您也可以使用GetLastError 来查看正在发生的事情。
  • 首先,我得到了内核没有找到GENERIC_READ的错误。所以我就是不能这样使用它
  • 只要定义它:GENERIC_READ = 0x80000000.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多