Как быстро проверить, не поврежден ли zip-файл? - PullRequest
9 голосов
/ 17 октября 2010

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

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

Ответы [ 4 ]

6 голосов
/ 24 октября 2010

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

5 голосов
/ 22 августа 2017

Используйте 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)
2 голосов
/ 17 октября 2010

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

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

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

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

1 голос
/ 12 ноября 2010

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

...