DotNetZip中大型文件存档的压缩问题

时间:2011-01-25 15:49:58

标签: c# compression zip dotnetzip

...问候

我正在使用最新的DotNetZip在c#3.5中编写备份程序。该程序的基础是在服务器上给出一个位置和一个跨区zip文件的最大大小。从那里它应该遍历给定位置的所有文件夹/文件并将它们添加到存档中,保持确切的结构。它还应将所有内容压缩到合理的数量。给定的未压缩文件夹/文件集合可以很容易地为10-25gb,创建的跨区文件每个限制为大约1GB。

我有一切工作(使用DotNetZip)。我唯一的挑战是实际发生的事情几乎没有。我选择使用“AddDirectory”方法来简化代码,一般来说它看起来适合我的项目。读完之后,我第二次猜测这个决定。

  1. 鉴于以下代码和档案中的大量文件,我应该压缩每个文件,因为它被添加到zip中吗?或者Adddirectory方法是否应该提供相同的压缩?

  2. 我已尝试过Ionic.Zlib.CompressionLevel提供的每个级别的压缩,似乎没有任何帮助。我应该考虑使用外部压缩算法并将其流式传输到我的DotNetZip文件中吗?

  3. using (ZipFile zip = new ZipFile())  
    {  
      zip.AddDirectory(root.FullName);  
    
      if (zipPassword.Length > 0)  
        zip.Password = zipPassword;  
    
      float size = zipGbSize * 1024 * 1024 * 1024;  
    
      zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;  
      zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress);  
      zip.ZipError += new EventHandler<ZipErrorEventArgs>(Zip_ZipError);  
      zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");  
      zip.MaxOutputSegmentSize = (int)size;   //in gig  
      zip.Name = archiveDir.FullName + @"\Task_" + taskId.ToString() + ".zip";  
      zip.Save();  
    }  
    

    感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我不确定是否低估了您的问题,但是任何zip文件its 4Gb的最大尺寸。也许你必须在每次达到这个限制时创建一个新的ZipFile

很抱歉,如果这对你没有帮助。

答案 1 :(得分:2)

  

1.如果将每个文件添加到zip中,我应该压缩下面的代码和存档中的大量文件吗?

DotNetZip的工作方式是在将每个文件添加到存档时压缩它们。您的应用不需要进行压缩。 DotNetZip为您完成此任务。

  

或Adddirectory方法是否应该提供相同的压缩?

通过AddDirectory()方法添加到zip文件的条目在写入zip存档时通过相同的代码路径,作为通过AddFile()添加的条目。压缩文件数据,然后可选地加密,然后写入zip文件。


未经请求的提示:您不需要这样做:

zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress);   

你可以这样做:

zip.AddProgress += Zip_AddProgress;   

您如何确定没有发生压缩?

如果您对每个条目的压缩感到好奇,可以注册一个SaveProgress事件处理程序。 SaveProgress事件在写入存档期间的不同时间被触发,包括保存开始时,DotNetZip开始写入一个条目的数据,在写入一个条目期间的不同时间间隔,在完成每个条目的数据写入后,以及写完所有数据后。这些阶段在the ZipProgressEventType enumeration中有所描述。当EventType为Saving_AfterWriteEntry时,您可以计算该特定条目的压缩率。

要验证压缩没有发生,我建议您注册这样的SaveProgress事件并查看该压缩率。

此外,如上所述,某些文件类型无法压缩。 JPG,MPG,MP3,ZIP文件和其他文件不是很可压缩的。


最后,如果您只是使用DotNetZip命令行工具,那么进行备份可能会更容易。如果您只想备份特定目录,则可以使用命令行工具(zipit.exe)并避免编写程序。使用zipit.exe工具,如果使用-v选项,该工具将打印进度报告,并将通过上述机制显示每个条目的压缩。即使您更喜欢编写自己的程序,也可以考虑使用zipit.exe来验证使用DotNetZip时是否发生压缩。

答案 2 :(得分:1)

您要压缩哪种数据?某些类型的数据不能很好地压缩,例如JPEG或已压缩的ZIP文件。