Я работаю над преобразованием моего сценария резервного копирования из оболочки в Python. Одна из особенностей моего старого скрипта заключалась в том, чтобы проверить созданный tarfile на целостность, выполнив: gzip -t.Проверка целостности tarfile в Python
В Python это кажется немного сложным.
Кажется, что единственный способ сделать это - прочитать каждый из сжатых объектов TarInfo в tarfile.
Есть ли способ проверить tarfile для целостности, без извлечения на диск или сохранения его в памяти (в полном объеме)?
Хорошие люди на #python on freenode предположили, что я должен прочитать каждый объект TarInfo, кусок по куску, отбросив каждый кусок, прочитанный.
Должен признаться, что я понятия не имею, как это сделать, поскольку я только что начал Python.
Представьте себе, что у меня есть файл обработан в 30GB, который содержит файлы, начиная от 1KB до 10GB ...
Это решение, которое я начал писать:
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 + GB (если у меня есть такие огромные файлы в архиве tar)
Бонус: Я пробовал вручную развращать zero.tar.gz (hex editor - редактирование среднего байта). Первый кроме не поймать IOError ... Вот результат:
Traceback (most recent call last):
File "./test.py", line 31, in <module>
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
Я пробовал модуль tarfile с большим количеством файлов, дело в том, что модуль tarfile.TarFile хранит все члены чтения (или записи) в своих «членах», , Так что это займет много памяти, когда вы намеренно читаете tarbomb с партиями, много маленьких файлов. – tdihp