English 中文(简体)
SharpZipLib的基础知识。我缺失了什么?
原标题:
  • 时间:2008-11-25 18:23:07
  •  标签:

我在我的代码中有以下的方法:

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文件,但每个文件都被列为4TB(未打包和已打包),当我试图打开它时会出现以下错误:

Extracting to "C:winntprofilesjbladtLOCALS~1Temp"
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

这个代码基本上是从示例中取出的,但似乎我少了什么东西。有没有人有什么提示?

最佳回答

我过去用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);
   }
问题回答

请查看Tyler Holmes的帖子

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

例如 (lì rú)

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

当前版本的zip压缩软件没有这个问题。

我曾遇到过类似的问题,通过在ZipEntry对象上指定CompressionMethodCompressedSize属性来解决。然而,在我的用法中,zip文件是为了将几个非常小的文件分组下载,而不是实际压缩文件,因此我没有使用任何压缩(级别0),并使用文件的实际大小来设置CompressedSize属性。如果需要压缩,不确定这样是否可行。

为了日后有同样问题的人的好处:我的问题是我使用了一个真正古老的WinZip版本(我想是8.0)来查看文件。使用现代的查看器(12.0)解决了问题。





相关问题
热门标签