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

问候….

我正在使用最新的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(Zip_AddProgress); zip.ZipError += new EventHandler(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(); } 

感谢您的任何帮助!

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

DotNetZip的工作方式是在将每个文件添加到存档时压缩它们。 您的应用不需要进行压缩。 DotNetZip为您做到这一点。

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

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


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

 zip.AddProgress += new EventHandler(Zip_AddProgress); 

你可以这样做:

 zip.AddProgress += Zip_AddProgress; 

你是如何确定没有压缩的?

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

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

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


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

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

对不起,如果这对你没有帮助。

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