web-dev-qa-db-ja.com

.ExtractのDotNetZipBadReadException

DotNetZipで圧縮すると、「解凍可能な」アーカイブが作成されるという奇妙なファイルがあります。 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

編集:

バイトを追加すると問題なく動作しますが、許容できる解決策ではありません。 + 1なしで失敗します。

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

更新:

単純な抽出では爆発しないため、あきらめて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));
21

Dllのサイズは53 * 128k(6954496/131072 = 53)であり、DotNetZipにバグがあります: https://dotnetzip.codeplex.com/workitem/14087 。コードで使用するだけです:

Zip.ParallelDeflateThreshold = -1;

私は多くのファイルでこの問題を抱えていました、それは今完全に機能しています;)

17
Xaruth

これはバグです。Zlib\ParallelDeflateOutputStream.csで修正できます。

変化する

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

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

詳細については、 https://dotnetzip.codeplex.com/workitem/14087 を参照してください。

4
laktak

私はこれを試しました-

  • DotNetZipの最新バージョンをインストールします
  • コードを実行します。
  • BadReadExceptionを取得しました

それならこれ-

  • DotNetZipの古いバージョン(1.9)をインストールします。 (Install-Package DotNetZip -Version 1.9
  • コードを実行する
  • コードは正常に機能します。

これはバグかもしれないと思いますか?