【问题标题】:How to quickly check if a zip file is corrupted?如何快速检查 zip 文件是否损坏?
【发布时间】:2011-04-26 15:39:43
【问题描述】:

有没有人知道如何根据文件大小快速实用地检查 zip 文件是否损坏?理想情况下,检查 zip 是否损坏的最佳方法是进行 CRC 检查,但这可能需要很长时间,尤其是在有很多大 zip 文件的情况下。我很高兴能够快速检查文件大小或标题。

提前致谢。

【问题讨论】:

  • 我目前正在使用 c# 来完成我的任务,但语言无关紧要。

标签: compression zip unzip corruption


【解决方案1】:

使用zip -T 测试文件是否损坏。示例损坏的文件如下所示:

 zip -T filename.zip
        zip warning: missing end signature--probably not a zip file (did you
        zip warning: remember to use binary mode when you transferred it?)
        zip warning: (if you are trying to read a damaged archive try -F)

zip error: Zip file structure invalid (filename.zip)

【讨论】:

  • 非常方便。也可以用来区分例如文件扩展名不可靠的 doc 和 docx 文件。
【解决方案2】:

DotNetZip 是一个免费的开源库,用于处理 .NET 语言中的 zip 文件,支持 CheckZip() 方法,可以满足您的需求。您可以选择各种级别的保证。基本级别只是检查元数据的一致性。最完整的级别将 zip 文件完全提取到 bitbucket 中,以验证实际压缩数据没有损坏。

【讨论】:

【解决方案3】:

Section 4.3.7 of this page 表示压缩后的大小是从第 18 个字节开始的 4 个字节。您可以尝试读取它并将其与文件的大小进行比较。

但是,我认为检查 zip 文件是否损坏几乎没用,原因有两个:

  1. 某些 zip 文件包含比 zip 部分更多的字节。例如,self-extracting archives 有一个可执行部分,但它们仍然是有效的 zip。
  2. 文件可能被损坏而不改变其大小。

因此,我建议计算 CRC 以确保检查损坏的方法。

【讨论】:

  • 此外,许多 zip 创建工具会在知道文件长度之前写入标头,因此这些字节保持为零(大概是为了支持流式传输)。
  • @SimonJ 说的是真的,而且 - 从字节 18 开始的压缩大小是 zip 文件中单个条目的压缩大小。它不是 zip 文件的压缩大小。
  • 此外,这可能很明显,但值得说明的是:“计算 CRC”仅在原始 CRC 已知的情况下才能验证文件。
【解决方案4】:

要“确定”检查整个存档,您需要提取所有数据(因为存储在存档中的 CRC 是根据未压缩数据计算的),即使在此之后,您也无法 100% 确定它没有损坏(因为CRC是好的,但不保证数据没有被改变)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多