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

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

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


person thuantta    schedule 17.10.2010    source источник
comment
В настоящее время я использую С# для своей задачи, но язык не имеет значения.   -  person thuantta    schedule 17.10.2010


Ответы (4)


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

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

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

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

person imgx64    schedule 17.10.2010
comment
Кроме того, многие инструменты для создания zip-файлов записывают заголовок до того, как узнают длину файла, поэтому эти байты остаются нулевыми (предположительно, для поддержки потоковой передачи). - person SimonJ; 17.10.2010
comment
То, что сказал @SimonJ, верно, но также - сжатый размер, начинающийся с 18-го байта, - это сжатый размер одной записи в zip-файле. Это не сжатый размер zip-файла. - person Cheeso; 24.10.2010
comment
Кроме того, это может быть очевидным, но стоит отметить: вычисление CRC работает для проверки файла, только если известен исходный CRC. - person Cheeso; 24.10.2010

Используйте 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)
person AzizSM    schedule 22.08.2017
comment
Очень удобно. Может также использоваться, чтобы различать, например, doc и docx, расширение которых ненадежно. - person geotheory; 05.01.2021

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

person Cheeso    schedule 24.10.2010
comment
CodePlex мертв, и эти страницы теперь находятся в архиве. - person HackSlash; 24.02.2020
comment
Может это один и тот же код? github.com/DinoChiesa/DotNetZip - person HackSlash; 24.02.2020

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

person Nickolay Olshevsky    schedule 12.11.2010