我有一个奇怪的文件,当用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。

更新2:

关于文件长度的某些信息会使其爆炸,正确压缩和解压缩了1179647和1179649字节。
var source = new FileInfo(@"C:\ZipDemo\foo.txt");
using (var writer = source.CreateText())
    writer.Write(new string('a', 1179648));

最佳答案

您的dll大小为53 * 128k(6954496/131072 = 53),并且在DotNetZip中有一个错误,您可以在其中读取:https://dotnetzip.codeplex.com/workitem/14087。只需在您的代码中使用:

zip.ParallelDeflateThreshold = -1;

我的很多文件都有这个问题,现在可以正常工作了;)

关于c# - .Extract上的DotNetZip BadReadException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15337186/

10-17 01:12