Подтвердить что ты не робот

DotNetZip BadReadException on.Extract

У меня есть странный файл, который при сжатии с DotNetZip создает "ununzipable" архив. Когда я пытаюсь разархивировать его с помощью 7zip, он терпит неудачу с CRC failed in 'AjaxControlToolkit.dll'. File is broken. Когда я застегиваю его с помощью 7zip вручную, он распаковывается.

Кто-нибудь сталкивается с сценарием, когда DotNetZip не может правильно закрепить простой двоичный файл? Или я неправильно использую DotNetZip?

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);
        }
    }
}

Броски:

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

Edit:

Если добавить лишний байт, он работает отлично, но это не приемлемое решение. Сбой без + 1.

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

Update:

Вышла и переключилась на SharpZipLib, так как она не взорвала простой экстракт, но было бы неплохо узнать, что не так с DotNetZip, у него более удобный API.

Update2:

Что-то о длине файла заставляет его взорваться, 1179647 и 1179649 байтов зашифрованы и распакованы правильно.

var source = new FileInfo(@"C:\ZipDemo\foo.txt");
using (var writer = source.CreateText())
    writer.Write(new string('a', 1179648));
4b9b3361

Ответ 1

Размер вашей DLL 53 * 128k (6954496/131072 = 53), и есть ошибка в DotNetZip, которую вы можете прочитать там: https://dotnetzip.codeplex.com/workitem/14087. Просто используйте в своем коде:

zip.ParallelDeflateThreshold = -1;

У меня была эта проблема для большого количества файлов, теперь она отлично работает;)

Ответ 2

Это ошибка - вы можете исправить ее в Zlib\ParallelDeflateOutputStream.cs.

изменить

} while (doAll && (_lastWritten != _latestCompressed));

к

} while (doAll && (_lastWritten != _lastFilled)); 

Подробнее см. https://dotnetzip.codeplex.com/workitem/14087.

Ответ 3

Я пробовал это -

  • Установить последнюю версию DotNetZip
  • Запустите свой код.
  • Получил исключение BadReadException

Тогда это -

  • Установите более старую версию (1.9) DotNetZip. (Install-Package DotNetZip -Version 1.9)
  • Запустите свой код
  • Код работает нормально.

Я предполагаю, что это может быть ошибка?