我正在将我的备份脚本从shell转换到Python。 我的旧脚本的一个功能是通过执行命令"gzip -t"检查创建的tar文件的完整性。 但在Python中似乎有点棘手。
看起来唯一的方法是逐个读取tar文件中压缩的TarInfo对象,然后检查其完整性。 是否有一种方法可以在不将其提取到磁盘或完整保留在内存中的情况下检查tar文件的完整性?
freenode上#python的好心人建议我应该逐块读取每个TarInfo对象并丢弃已读取的每个块。 但我承认,由于我刚开始学习Python,我不知道如何做到这一点。
想象一下,我有一个30GB的tar文件,其中包含大小从1kb到10GB的文件...这是我开始编写的解决方案:
看起来唯一的方法是逐个读取tar文件中压缩的TarInfo对象,然后检查其完整性。 是否有一种方法可以在不将其提取到磁盘或完整保留在内存中的情况下检查tar文件的完整性?
freenode上#python的好心人建议我应该逐块读取每个TarInfo对象并丢弃已读取的每个块。 但我承认,由于我刚开始学习Python,我不知道如何做到这一点。
想象一下,我有一个30GB的tar文件,其中包含大小从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()
这段代码还远未完成。如果我在一个大约30GB的tar归档文件上运行它,我不敢保证check对象不会超过10GB以上(如果tar归档文件中有这么大的文件的话)。
额外说明: 我尝试手动损坏zero.tar.gz文件(使用十六进制编辑器在文件中间编辑几个字节)。第一个异常没有捕获到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