2010-10-17 38 views
9

¿Alguien tiene alguna idea de cómo comprobar pragmáticamente rápidamente si un archivo zip está dañado en función del tamaño del archivo? Idealmente, la mejor manera de comprobar si un archivo comprimido está dañado es realizar una verificación CRC, pero esto puede llevar mucho tiempo, especialmente si hay muchos archivos zip grandes. Me encantaría poder hacer un control de tamaño de archivo rápido o de encabezado.¿Cómo verificar rápidamente si un archivo zip está dañado?

Gracias de antemano.

+0

¿Algún idioma de elección? – birryree

+0

Actualmente estoy usando C# para mi tarea, pero el idioma no importa. – thuantta

Respuesta

3

Section 4.3.7 of this page dice que el tamaño comprimido es de 4 bytes a partir del byte 18. Puede intentar leer eso y compararlo con el tamaño del archivo.

Sin embargo, creo que es bastante inútil para comprobar si el archivo zip está dañado por dos razones:

  1. Algunos archivos zip contienen más bytes que sólo la parte de cremallera. Por ejemplo, self-extracting archives tienen una parte ejecutable pero aún son válidas en formato zip.
  2. El archivo puede estar dañado sin cambiar su tamaño.

Por lo tanto, sugiero calcular el CRC para un método garantizado de comprobación de corrupción.

+0

Además, muchas herramientas de creación zip escribirán el encabezado antes de conocer la longitud del archivo, por lo que estos bytes permanecen cero (para admitir la transmisión, presumiblemente). – SimonJ

+0

Lo que @SimonJ dijo es cierto, pero también: el tamaño comprimido que comienza en el byte 18 es el tamaño comprimido de una sola entrada en el archivo zip. No es el tamaño comprimido del archivo zip. – Cheeso

+0

Además, esto puede ser obvio, pero vale la pena mencionar: "calcular el CRC" funciona para verificar el archivo, solo si se conoce el CRC original. – Cheeso

6

DotNetZip, una biblioteca gratuita de código abierto para manejar archivos zip en idiomas .NET, admite un método CheckZip() que hace lo que usted desea. Hay varios niveles de seguridad disponibles según su opción. El nivel básico solo verifica la consistencia de los metadatos. El nivel más completo realiza una extracción completa del archivo comprimido en un bitbucket para verificar que los datos comprimidos no estén dañados.

1

Para revisar todo el archivo 'seguro' necesita extraer todos los datos (ya que CRC, almacenado en el archivo, se calcula sobre datos sin comprimir), e incluso después de eso no puede estar seguro de que no es 100% corrupto (porque CRC es bueno, pero no, garantiza que los datos no fueron alterados).

0

Utilice zip -T para probar si el archivo está dañado o no. La muestra del archivo dañado se ve así:

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) 
Cuestiones relacionadas