4

我的代码中有以下方法:

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

代码实际上取自样本,但我似乎遗漏了一些东西。有没有人有任何指示?

4

4 回答 4

7

在切换到DotNetZip之前,我曾经使用 SharpZipLib。您可能希望将其作为替代方案进行检查。

例子:

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);
   }
于 2008-11-25T19:41:06.033 回答
3

泰勒福尔摩斯的帖子

Winzip 8.0 和其他版本的问题在于 Zip64。添加 ZipEntry 时设置原始文件大小,错误消失。

例如

string fileName = ZipEntry.CleanName(fi.Name);
ZipEntry entry = new ZipEntry(fileName);
entry.DateTime = fi.LastWriteTime;
entry.Size = fi.Length;
zipStream.PutNextEntry(entry);

当前版本的 zip 实用程序没有问题。

于 2008-12-13T04:43:55.547 回答
2

我有一个类似的问题,我通过在对象上指定CompressionMethodCompressedSize属性解决了这个问题。ZipEntry然而,在我的使用中,创建 zip 是为了在一次下载中组合几个非常小的文件,而不是实际压缩文件,所以我没有使用不压缩(级别 0)并使用文件的实际大小作为CompressedSize属性。如果需要压缩,不确定它会如何工作。

于 2008-11-25T18:37:14.103 回答
0

为了将来遇到同样问题的任何人的利益:我的问题原来是我使用的是真正古老的 WinZip 版本(我认为是 8.0)来查看文件。使用现代查看器(12.0)解决了这个问题。

于 2008-12-03T22:38:48.063 回答