我的代码中有以下方法:
private bool GenerateZipFile(List<FileInfo> filesToArchive, DateTime archiveDate)
{
try
{
using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(GetZipFileName(archiveDate))))
{
zipStream.SetLevel(9); // maximum compression.
byte[] buffer = new byte[4096];
foreach (FileInfo fi in filesToArchive)
{
string fileName = ZipEntry.CleanName(fi.Name);
ZipEntry entry = new ZipEntry(fileName);
entry.DateTime = fi.LastWriteTime;
zipStream.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(fi.FullName))
{
StreamUtils.Copy(fs, zipStream, buffer);
}
zipStream.CloseEntry();
}
zipStream.Finish();
zipStream.Close();
}
return true;
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
return false;
}
}
此代码生成一个包含所有正确条目的ZIP文件,但每个文件列为4 TB(解压缩和打包)并在我尝试打开时出现以下错误:
Extracting to "C:\winnt\profiles\jbladt\LOCALS~1\Temp\"
Use Path: no Overlay Files: yes
skipping: QPS_Inbound-20081113.txt: this file is not in the standard Zip 2.0 format
Please see www.winzip.com/zip20.htm for more information
error: no files were found - nothing to do
代码几乎取自样本,但我似乎遗漏了一些东西。有没有人有任何指示?
答案 0 :(得分:7)
我曾经使用SharpZipLib,直到我切换到DotNetZip您可能想要将其作为替代方案进行检查。
示例:
try
{
using (ZipFile zip = new ZipFile("MyZipFile.zip")
{
zip.AddFile("c:\\photos\\personal\\7440-N49th.png");
zip.AddFile("c:\\Desktop\\2005_Annual_Report.pdf");
zip.AddFile("ReadMe.txt");
zip.Save();
}
}
catch (System.Exception ex1)
{
System.Console.Error.WriteLine("exception: " + ex1);
}
答案 1 :(得分:3)
Winzip 8.0和其他问题与Zip64有关。添加ZipEntry时设置原始文件大小,错误消失。
e.g。
string fileName = ZipEntry.CleanName(fi.Name);
ZipEntry entry = new ZipEntry(fileName);
entry.DateTime = fi.LastWriteTime;
entry.Size = fi.Length;
zipStream.PutNextEntry(entry);
当前版本的zip实用程序没有问题。
答案 2 :(得分:2)
我遇到了类似的问题,我通过在CompressionMethod
对象上指定CompressedSize
和ZipEntry
属性来解决这个问题。然而,在我的使用中,创建zip是为了在一次下载中分组几个非常小的文件而不是实际压缩文件,因此我不使用压缩(级别0)并使用文件的实际大小{{1属性。不确定如果需要压缩会如何工作。
答案 3 :(得分:0)
为了将来遇到同样问题的人的利益:我的问题是我使用真正古老版本的WinZip(8.0,我认为)来查看文件。使用现代观众(12.0)解决了这个问题。