Как быстро проверить, поврежден ли zip-файл?

есть ли у кого-нибудь идеи о том, как прагматически быстро проверить, поврежден ли zip-файл на основе размера файла? В идеале лучший способ проверить, если молния повреждена, сделать проверку CRC, но это может занять много времени, особенно если есть много больших zip-файлов. Я был бы рад просто иметь возможность сделать быстрый размер файла или проверить заголовок.

спасибо заранее.

4 ответов


раздел 4.3.7 этой страницы говорит, что сжатый размер составляет 4 байта, начиная с байта 18. Вы можете попробовать прочитать это и сравнить его с размером файла.

тем не менее, я думаю, что это в значительной степени бесполезно для проверки, если zip-файл поврежден по двум причинам:

  1. некоторые zip-файлы содержат больше байтов, чем только zip-часть. Например, самораспаковывающиеся архивы имеют исполняемую часть, но они все еще действительны застежка-молния.
  2. файл может быть поврежден без изменения его размера.

Итак, я предлагаю вычислить CRC для гарантированного метода проверки на коррупцию.


DotNetZip, бесплатная библиотека с открытым исходным кодом для обработки zip-файлов на языках .NET, поддерживает CheckZip () метод, который делает то, что вы хотите. Различные уровни обеспечения доступные на вашем варианте. Базовый уровень просто проверяет согласованность метаданных. Самый полный уровень выполняет полное извлечение zip-файла в bitbucket, чтобы убедиться, что фактические сжатые данные не повреждены.


использовать 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)

чтобы проверить весь архив "наверняка", вам нужно извлечь все данные (так как CRC, хранящийся в архиве, вычисляется поверх несжатых данных), и даже после этого вы не можете быть уверены на 100%, что он не поврежден (потому что CRC хорош, но не гарантирует, что данные не были изменены).