【发布时间】:2013-03-11 11:14:18
【问题描述】:
我有一个奇怪的文件,当使用 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));
【问题讨论】:
-
如果你尝试用其他工具解压缩它会发生什么,比如 WinRar ?
-
@Tigran 只是得到各种错误,即使用内置的 Windows 提取器我得到 0x80004005 未指定的错误。
-
在 System.IO.Compression 中尝试 .net 4.5 中的 ZipArchive,看看是否遇到同样的问题。这很可能是一个错误。