I have a Python script that reads a file (typically from optical media) marking the unreadable sectors, to allow a re-attempt to read said unreadable sectors on a different optical reader.
I discovered that my script does not work with block devices (e.g. /dev/sr0), in order to create a copy of the contained ISO9660/UDF filesystem, because
os.stat().st_size is zero. The algorithm currently needs to know the filesize in advance; I can change that, but the issue (of knowing the block device size) remains, and it's not answered here, so I open this question.
I am aware of the following two related SO questions:
- Determine the size of a block device (/proc/partitions, ioctl through ctypes)
- how to check file size in python? (about non-special files)
Therefore, I'm asking: in Python, how can I get the file size of a block device file?
Creating a new window that stays on top even when in full screen mode (Qt on Linux)
1:How can I figure out why cURL is hanging and unresponsive?
def receive _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)
2:How to detect pending system shutdown on Linux?
Other unixes will have different values for req, buf, fmt of course..
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) print device_path, 'is around ', bytes / (1024 ** 2), 'megabytes'
I don't have a suitable computer at hand to test this. I'd be curious to know if it works :).
import fcntl c = 0x00001260 ## check man ioctl_list, BLKGETSIZE f = open('/dev/sr0', 'ro') s = fcntl.ioctl(f, c) print s