Проверка целостности tarfile в Python
Я работаю над преобразованием моего резервного скрипта из оболочки в Python. Одной из особенностей моего старого скрипта было проверить целостность созданного tarfile, выполнив: gzip -t.
Это кажется немного сложным в Python.
Кажется, что единственный способ сделать это - прочитать каждый из сжатых объектов TarInfo внутри tar-файла.
Есть ли способ проверить tar-файл на целостность, не извлекая на диск или не сохраняя его в памяти (в нем 'с))
Хорошие люди на #python на freenode предложили мне читать каждый объект TarInfo по частям, отбрасывая каждую прочитанную часть чанка.
Я должен признать, что понятия не имею, как это сделать, видя, что я только начал Python.
Представьте, что у меня есть tarfile 30 ГБ, который содержит файлы размером от 1 КБ до 10 ГБ ...
Это решение, которое я начал писать:
try:
tardude = tarfile.open("zero.tar.gz")
except:
print "There was an error opening tarfile. The file might be corrupt or missing."
for member_info in tardude.getmembers():
try:
check = tardude.extractfile(member_info.name)
except:
print "File: %r is corrupt." % member_info.name
tardude.close()
Этот код далеко не закончен. Я бы не посмел запустить это на огромном архиве tar размером 30 ГБ, потому что в какой-то момент проверка была бы объектом размером 10+ ГБ (если у меня есть такие огромные файлы в архиве tar)
Бонус: я попытался вручную испортить zero.tar.gz (редактор шестнадцатеричных файлов - отредактировать несколько байтов). Первый кроме IOError не ловит ... Вот вывод: I '
Traceback (most recent call last):
File "./test.py", line 31, in
for member_info in tardude.getmembers():
File "/usr/lib/python2.7/tarfile.py", line 1805, in getmembers
self._load() # all members, we first have to
File "/usr/lib/python2.7/tarfile.py", line 2380, in _load
tarinfo = self.next()
File "/usr/lib/python2.7/tarfile.py", line 2315, in next
self.fileobj.seek(self.offset)
File "/usr/lib/python2.7/gzip.py", line 429, in seek
self.read(1024)
File "/usr/lib/python2.7/gzip.py", line 256, in read
self._read(readsize)
File "/usr/lib/python2.7/gzip.py", line 320, in _read
self._read_eof()
File "/usr/lib/python2.7/gzip.py", line 342, in _read_eof
hex(self.crc)))
IOError: CRC check failed 0xe5384b87 != 0xdfe91e1L