在Python中查询块设备文件的大小

我有一个Python脚本,用于读取标记不可读扇区的文件(通常来自光学介质),允许重新尝试在不同的光学读取器上读取所述不可读的扇区。

我发现我的脚本不能用于块设备(例如/ dev / sr0),以便创build一个包含的ISO9660 / UDF文件系统的副本,因为os.stat().st_size是零。 该algorithm目前需要预先了解文件大小; 我可以改变这一点,但(知道块设备的大小)的问题仍然存在,这里没有回答,所以我打开这个问题。

我知道以下两个相关的SO问题:

  • 确定块设备的大小 (/ proc / partitions,通过ctypes的ioctl)
  • 如何检查在Python中的文件大小? (关于非特殊文件)

因此,我问:在Python中,如何获得块设备文件的文件大小?

Python解决方案的“最干净”(即不依赖于外部卷和最可重用)是打开设备文件并在最后查找,返回文件偏移量:

 def get_file_size(filename): "Get the file size by seeking at end" fd= os.open(filename, os.O_RDONLY) try: return os.lseek(fd, 0, os.SEEK_END) finally: os.close(fd) 

特定于Linux的基于ioctl的解决方案:

 import fcntl import struct device_path = '/dev/sr0' req = 0x80081272 # BLKGETSIZE64, result is bytes as unsigned 64-bit integer (uint64) buf = ' ' * 8 fmt = 'L' with open(device_path) as dev: buf = fcntl.ioctl(dev.fileno(), req, buf) bytes = struct.unpack('L', buf)[0] print device_path, 'is about', bytes / (1024 ** 2), 'megabytes' 

其他unixes当然会有不同的req,buf,fmt值。

试图从其他答案适应:

 import fcntl c = 0x00001260 ## check man ioctl_list, BLKGETSIZE f = open('/dev/sr0', 'ro') s = fcntl.ioctl(f, c) print s 

我手头没有合适的电脑来测试。 我会很好奇,知道它是否工作:)