2

我在 Windows 8 上使用 python 3.3 32 位。我想从物理磁盘读取二进制扇区。我能够从设备打开、查找、读取、告知,但文件结尾不会产生空的读取结果,它会引发权限异常 (33)。我也无法使用相对于结尾的搜索,例如搜索(-512,os.SEEK_END)。任何 SEEK_END 或 2 的使用都会引发 Invalid Argument。

我真的不希望必须使用权限异常来检测 eof,因为在读取设备时可能会出现真正的权限错误,并且需要警告用户此故障。

我欢迎任何关于这里出了什么问题的提示,或者检测 eof 的替代方法。

代码示例如下,设备为 1GBit USB。seek/tell/prints 是为了表明在 eof 之前读取是正常的。

代码:

device = r'\\.\PhysicalDrive2'  
disk = open(device,'rb')  
disk.seek(1994231*512)  
sector = disk.read(512)  
while sector!="":  
    sector = disk.read(512)  
    print(disk.tell()) 

输出:

1021047296 1021047808 1021048320 1021048832 1021049344 1021049856 1021050368 Traceback(最近一次调用最后):文件“D:\Development\eclipse\test\test.py”,第 25 行,扇区 = disk.read(512) IOError: [Err拒绝

4

1 回答 1

0

当它无法读取驱动器(或文件)末尾的整个数据块时,您的权限被拒绝。这是一个例子。另外,请务必以管理员身份运行 Python。(使用 Windows 10 和 Python 3.8.2)

import re
import time

starttime = time.time()

stuff = []
chunk = 512
with open(r"\\.\physicaldrive11",'rb') as file_obj: #Physical Drive
#with open("test.bin",'rb') as file_obj: #File
    while True:
        try:
            data=file_obj.read(chunk)
            #do cool stuff and append to list
            #stuff.append(cool stuff)
            #print (stuff)
            print (data) # if you want to see what it is doing... use a small drive, unless you want to wait forever  :-)
            
            if data == b'':
                file_obj.close()
                break

        except PermissionError:
            chunk = chunk-1
            print ("Trying smaller chunk",chunk)
            continue

endtime = time.time()
timerun = endtime - starttime
print (timerun)

于 2020-09-15T19:49:35.727 回答