Размер запроса файла блочного устройства в Python - PullRequest
3 голосов
/ 05 мая 2010

У меня есть скрипт Python, который считывает файл (обычно с оптического носителя), помечающий нечитаемые сектора, чтобы разрешить повторную попытку чтения указанных нечитаемых секторов на другом оптическом считывателе.

Я обнаружил, что мой скрипт не работает с блочными устройствами (например, / dev / sr0), чтобы создать копию файловой системы ISO9660 / UDF, потому что os.stat().st_size равен нулю. Алгоритм в настоящее время должен знать размер файла заранее; Я могу это изменить, но проблема (знания размера блочного устройства) остается, и здесь нет ответа, поэтому я открываю этот вопрос.

Мне известны следующие два связанных с этим вопроса SO:

Поэтому я спрашиваю: как в Python получить размер файла блочного устройства?

Ответы [ 3 ]

7 голосов
/ 05 мая 2010

«Самым чистым» (т.е. не зависящим от внешних томов и наиболее повторно используемым) решением 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)
5 голосов
/ 17 октября 2012

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'

Другие Unix, конечно же, будут иметь различные значения для req, buf, fmt.

0 голосов
/ 12 апреля 2012

Пытается приспособиться от другого ответа:

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

У меня нет подходящего компьютера, чтобы проверить это. Мне было бы интересно узнать, работает ли это:)

...