При доступе к необработанному диску в Windows через Python open()
он по какой-то причине не позволяет мне прочитать последние 10240 байт (т.е. последние 5 секторов по 2048 байт/сектор).
При сбросе образа диска другими способами и сравнении образов я вижу, что данные также нельзя считать пустыми. Фактически, в первом из отсутствующих секторов присутствует тег привязки UDF с соответствующими метаданными. Следующие сектора полностью пусты.
Вот как я сбросил содержимое диска:
out = open("test.iso", "wb")
with open(r"\\.\D:", "rb") as f:
while True:
data = f.read(512)
if len(data) == 0:
break
out.write(data)
Если я возьму тот же объект open() и скажу ему искать до самого конца диска, он это сделает. Так что может явно дотянуться до секторов хотя бы по поиску. Если я затем вернусь к 10240 байтам, а затем попытаюсь f.read(...)
, он вернет b''
(пустой результат), а не ошибку. Неважно, какого размера я говорю, чтобы он читал. Я пробовал все виды размеров, без аргументов/по умолчанию, 1, 12, 255, 512, 2048, 999999 и т. д.
В другом ответе StackOverflow на другой (но связанный) вопрос также сообщалось об аналогичных выводах по расширенным аудиодискам, но с тех пор обсуждение не обсуждалось.
Я протестировал это на нескольких DVD-дисках от разных студий и создателей, все они в отличном состоянии и все еще встречаются.
Пример воспроизводящего кода:
- Я не знаю, случится ли это с вами на вашей системной конфигурации/диске/ридере).
- Зависимости PyPI: wmic
- WMIC также сообщает размер диска - 10240, возможно, это проблема Windows?
import os
from wmi import WMI
DISC_LETTER = "D:"
c = WMI()
disc_info = next(iter(c.Win32_CDROMDrive(Drive=DISC_LETTER)), None)
if not disc_info:
raise("Disc %s not found...", DISC_LETTER)
disc_size = int(disc_info.size)
disc_size += 10240 # WMIC also reports the size without 10240, but it is real!
f = open(r"\\.\%s" % DISC_LETTER, "rb")
f.seek(disc_size)
if f.tell() == disc_size:
print("Seeked to the end of the disc...")
f.seek(-10240, os.SEEK_CUR)
if f.tell() == disc_size - (2048 * 5):
print("Seeked 5 sectors before the end of the disc...")
data = f.read(2048 * 5):
print("Data read (len: %d): %b" % (len(data), data))
Любые идеи о том, почему это может быть здорово, поскольку я пробовал везде, где мог.
seek
ing со смещением каждого сектора, прежде чем читать его? Снято в темноте, но... - person AKX   schedule 14.04.2021