私は、DotNetZipで圧縮されたときにununzipableアーカイブを作成する奇妙なファイルがあります。私が7zipで解凍しようとすると失敗しますCRC failed in 'AjaxControlToolkit.dll'. File is broken.
7zipで手動で解凍すると問題はありません。DotNetZip BadReadException on .Extract
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バイトはzip圧縮され、正しく解凍し、爆破ます。
var source = new FileInfo(@"C:\ZipDemo\foo.txt");
using (var writer = source.CreateText())
writer.Write(new string('a', 1179648));
そして、あなたはいくつかの他のツールとそれを解凍しようとした場合、何が、たとえば、WinRarのをどうなりますか? – Tigran
@Tigranは、さまざまなエラーが発生します。つまり、Windowsの抽出機能を使用すると、0x80004005というエラーが発生します。 –
System.IO.Compressionの.net 4.5からZipArchiveを試して、同じ問題が発生していないかどうかを確認してください。バグかもしれない。 –