【问题标题】:Handling corrupted archives in python在 python 中处理损坏的档案
【发布时间】:2014-06-15 20:05:46
【问题描述】:

我有一个文件压缩/解压缩系统,我首先检查文件是否被压缩,如果没有,我将这个文件压缩成一个 tar 存档 (tar.gz)。然后将压缩档案上传到服务器。上传后,服务器解压文件,并对该文件进行一些处理。

如果压缩服务在压缩文件期间关闭,则会出现问题。结果,tar 存档被损坏。

....
tar = tarfile.open(compress_file_name, "w:gz")
tar.add(file_path, arcname=file_name)
tar.close()
....

为了验证我尝试的文件的完整性

try:
    f = tarfile.open(file_path) # This should throw CRC error but its not
except Exception, e:
    raise e

但事实上 python 似乎可以很好地打开文件。为了验证文件是否真的没问题,我尝试打开文件tar -xvzf <corrupted_archive>,我得到了

[~/]$ tar -xvzf <corrupted_archive>

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

现在我可以使用subprocess.call(['tar','-xvzf',archive_name]) 在python 中使用相同的过程,但实际上我是一种验证文件完整性的pythonic 方法。

任何帮助将不胜感激。

【问题讨论】:

    标签: python tar


    【解决方案1】:

    除非标题损坏,否则打开文件不会产生任何错误。您需要阅读整个文件才能发现错误。不管这是 tar.gz,来自 GZIP (.gz) 部分的 CRC 将足以(希望)揭示错误:

    import gzip
    
    with gzip.open(file_path) as g:
        try:
            while g.read(1024 * 1024):
                pass
        except IOError as e:
            print("Corrupted!", e)
    

    【讨论】:

    • 感谢您的回复。它按预期工作。我可以问一下,据我所知,g.read() 会读取内存中的整个文件吗?如果我有一个大存档(假设是 20GB 损坏的存档)怎么办。
    • 不,它会读取并丢弃它。如果您的存档很大,则需要一些时间,但内存使用量不会改变。
    • 不,g.read() 会读取内存中的整个文件,然后丢弃,这样你就会遇到问题
    • 如果您的文件很大,祝您好运。
    • 很遗憾,TAr 和 GZIP 无法检测到所有损坏。损坏的 GZIP 存档可能具有正确的 CRC 校验和。甚至可能发生损坏的 TAr 存档提取而没有任何错误或警告的情况。这就是为什么经常与 tarfile 一起提供强校验和(通常是 SHA)的原因。更现代的容器(例如 XZ)嵌入了 SHA 校验和以进行更好的完整性检查。
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多