Tengo una extraña archivo que cuando zip con DotNetZip crea un ‘ununzipable » archive». Cuando trato de descomprimirlo con 7zip falla con CRC failed in 'AjaxControlToolkit.dll'. File is broken. Cuando me zip con 7zip manualmente se baja la cremallera de multa.

Alguien ha llegado a través de un escenario donde DotNetZip no comprimir un simple archivo binario correctamente? O estoy utilizando DotNetZip incorrectamente?

https://dl.dropbox.com/u/65419748/AjaxControlToolkit.dll

using System.IO;
using Ionic.Zip;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var source = new FileInfo(@"C:\ZipDemo\AjaxControlToolkit.dll");
            var target = new FileInfo(Path.ChangeExtension(source.FullName, "zip"));
            var folder = new DirectoryInfo(Path.ChangeExtension(source.FullName, null));

            if (target.Exists)
                target.Delete();

            if (folder.Exists)
                folder.Delete(true);

            using (var zip = new ZipFile(target.FullName))
            {
                zip.AddFile(source.FullName, string.Empty);
                zip.Save();
            }

            using (var zip = new ZipFile(target.FullName))
                zip.ExtractAll(folder.FullName);
        }
    }
}

Lanza:

Unhandled Exception: Ionic.Zip.BadReadException: bad read of entry AjaxControlToolkit.dll from compressed archive.
   at Ionic.Zip.ZipEntry._CheckRead(Int32 nbytes)
   at Ionic.Zip.ZipEntry.ExtractOne(Stream output)
   at Ionic.Zip.ZipEntry.InternalExtract(String baseDir, Stream outstream, String password)
   at Ionic.Zip.ZipFile._InternalExtractAll(String path, Boolean overrideExtractExistingProperty)
   at Ionic.Zip.ZipFile.ExtractAll(String path)
   at ConsoleApplication1.Program.Main(String[] args) in C:\ZipDemo\ConsoleApplication1\ConsoleApplication1\Program.cs:line 27

Edición:

Si puedo añadir un byte extra, funciona muy bien, pero no es una solución aceptable. Falla sin la + 1.

var bytes = new byte[source.Length + 1];
File.ReadAllBytes(source.FullName).CopyTo(bytes, 0);
zip.AddEntry(source.Name, bytes);

Actualización:

Renunció y pasó a SharpZipLib como no explotar simple extracto, pero seguro que sería bueno saber lo que estaba mal con DotNetZip, tiene un API bastante mejor.

Update2:

Algo sobre la extensión de archivo hace volar, 1179647 y 1179649 bytes comprimido y descomprimido correctamente.

var source = new FileInfo(@"C:\ZipDemo\foo.txt");
using (var writer = source.CreateText())
    writer.Write(new string('a', 1179648));
  • Y ¿qué sucede si se intenta descomprimir con alguna otra herramienta, digamos, WinRar ?
  • acaba de obtener varios errores, es decir, con construido en Windows extractor puedo obtener 0 x 80004005 error no especificado.
  • Trate de ZipArchive de .net 4.5, en el Sistema.IO.La compresión, a ver si tiene el mismo problema. Bien puede ser un error.

3 Comentarios

  1. 16

    Tamaño de su archivo dll 53*128 kb (6954496/131072 = 53), y hay un error en la DotNetZip como se puede leer allí : https://dotnetzip.codeplex.com/workitem/14087. Sólo usar en el código:

    zip.ParallelDeflateThreshold = -1;

    He tenido este problema por la gran cantidad de archivos, funciona a la perfección ahora 😉

    • se trabajó con así! Gracias mucho 🙂
    • Esto resuelve el mismo problema en C#4.5 método de Compresión de Archivos también 🙂
    • Gracias! Esta es la solución fácil y suficiente para mí. La compilación de la corrección sugerida por @laktak a continuación es probablemente la mejor opción, pero probablemente innecesario, a menos que usted realmente necesita la optimización de paralelo a desinflar. Es una pena que el código oficial de repos parece haber estado inactivo desde 2011 – no sé si hay una versión más activo, que continuó la actualización o no.
  2. 2

    He probado este –

    • Instalar la Última versión de DotNetZip
    • Ejecutar su código.
    • Consiguió el BadReadException

    Entonces esta –

    • Instalar una versión anterior (1.9) de DotNetZip. (Install-Package DotNetZip -Version 1.9)
    • Ejecutar su código
    • Código funciona bien.

    Supongo que esto podría ser un error?

    • Parece que, presentado un error dotnetzip.codeplex.com/workitem/16092 no se puede saber si hay otros como él, parece como CodePlex sí se hallan roto y no mostrar el workitem descripciones.
    • Fresco. Se han actualizado su error con el ejemplo de que pudiera conseguir un trabajo, debe ser útil para cualquier persona de solución de problemas.
    • esa no es la solución ! Como cambiar la versión, el tamaño está cambiando, así que no veo el problema … por ahora. Pero la próxima actualización, el problema puede accurs de nuevo !
    • no estoy seguro de que entiendo su punto. Todo lo que hice fue agregar un archivo a archivo, extraer y comparar con el original. Se produjo una excepción. Ref este problema para algunos análisis sobre estas líneas.

Dejar respuesta

Please enter your comment!
Please enter your name here