DotNetZip中大量文件的压缩问题

4

您好...

我正在使用最新的DotNetZip在c# 3.5中编写一个备份程序。程序的基本功能是给定服务器上的位置和分段zip文件的最大大小,然后开始工作。从那里开始,它应该遍历给定位置的所有文件夹/文件并将它们添加到归档中,保持精确的结构。它还应该将所有内容压缩到合理的数量。一个未经压缩的文件夹/文件集合可能很容易达到10-25GB,而创建的分段文件每个限制在约1GB左右。

我已经完成了所有工作(使用DotNetZip)。我的唯一挑战是实际上几乎没有压缩发生。我选择使用“AddDirectory”方法来简化代码,并且通常它似乎非常适合我的项目。阅读了一些资料之后,我对这个决定有所怀疑。

  1. 在考虑下面的代码以及存档中的大量文件时,我应该在添加到zip文件时压缩每个文件吗?还是Adddirectory方法提供的压缩效果差不多?

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

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个回答

2
给定以下代码和大量存档文件,我应该在将每个文件添加到zip时压缩它吗?
DotNetZip的工作方式是在将每个文件添加到存档中时对其进行压缩。您的应用程序不需要进行压缩。 DotNetZip会为您完成此操作。
还是Adddirectory方法提供了相同的压缩?
通过AddDirectory()方法添加到zip文件中的条目在写入zip存档时经过与通过AddFile()添加的条目相同的代码路径。 文件数据被压缩,然后可选地加密,然后写入zip文件。
一个不请自来的提示:您不需要执行以下操作:
zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress);   

您可以这样做:
zip.AddProgress += Zip_AddProgress;   

你是如何判断不进行压缩的?如果你想了解每个条目的压缩情况,可以注册SaveProgress事件处理程序。在编写存档期间,包括开始保存、DotNetZip开始为一个条目编写数据、在编写一个条目的过程中的各个时间间隔,在完成每个条目的数据编写后以及完成所有数据编写后,都会触发SaveProgress事件。这些阶段在ZipProgressEventType枚举中有所描述。当EventType为Saving_AfterWriteEntry时,你可以计算特定条目的压缩比率。

要验证不发生压缩,建议你注册此类SaveProgress事件,并查看该压缩比率。

另外,正如上面所述,某些文件类型无法压缩。JPG、MPG、MP3、ZIP文件等不太可压缩。


最后,如果你只想备份特定目录,使用DotNetZip命令行工具可能更容易。你可以使用命令行工具(zipit.exe)而不是编写一个程序。使用zipit.exe工具,如果使用-v选项,该工具会打印进度报告,并通过我上面描述的机制显示每个条目的压缩情况。即使你更喜欢编写自己的程序,当你使用DotNetZip时,你也可以考虑使用zipit.exe来验证是否进行了压缩。


谢谢您的回复,Cheeso。那确实是我需要的信息。我之所以说没有压缩发生,是因为原始文件集和分割后的文件集的大小几乎相同。我已经确认了该集合中几乎没有zip、图像、音乐文件。我将尝试您的建议并监控SaveProgress事件,至少获得一个平均压缩值。再次感谢您的反馈。 - David

2
我不确定是否理解了你的问题,但任何zip文件的最大大小是4GB。也许你需要每次达到这个限制时创建一个新的ZipFile。
如果这不能帮助你,很抱歉。

由于限制,压缩文件正在被分割成多个部分(z01、z02、z03...)。每个部分的大小为1GB,并且还有一个“父”压缩文件,大小也约为1GB。 - David

1
你正在压缩什么类型的数据?有些数据并不容易被压缩,例如JPEG或已经被压缩过的ZIP文件。

1
这是所有平均文件的混乱。文档、图片、下载、PDF等等。公司中的每个人都有一个共享驱动器连接到服务器。我想要备份服务器上的所有这些文件。 - David
2
docx、xlsx等文件实际上都是zip文件。大多数图片格式都是经过压缩的。我猜源文件中大部分是无法压缩的。 - phoog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接