2011-01-25 89 views
4

问候大型归档文件的....压缩问题与DotNetZip

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

我有一切工作(使用DotNetZip)。我唯一的挑战就是实际发生的事情很少或根本没有。为了简化代码,我选择使用“AddDirectory”方法,并且一般来说它看起来好像适合我的项目。经过阅读,我第二次猜测这个决定。

  1. 考虑下面的代码并存档中的大量文件,我应该压缩每个文件,因为它被添加到压缩?或者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(); 
} 

感谢您的帮助!

回答

2

1.给下面的代码和档案中的大量文件,我应该压缩每个文件,因为它被添加到压缩?

DotNetZip的工作方式是压缩每个文件,因为它被添加到存档。你的应用程序不需要进行压缩。 DotNetZip为你做这个。

或者应该Adddirectory方法提供大约相同的压缩?

条目添加到经由AddDirectory()方法经过相同的代码路径zip存档被写入时,经由AddFile添加的条目()的zip文件。文件数据被压缩,然后选择加密,然后写入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选项,该工具将打印进度报告,并将通过上述机制显示每个条目的压缩。即使您更愿意编写自己的程序,也可以考虑在使用DotNetZip时使用zipit.exe来验证压缩是否发生。

2

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

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

+0

由于该限制(z01,z02,z03 ....),正在拆分zip文件。每个分割是1GB,以及也是大约1GB的“父”压缩。 – David 2011-01-26 16:01:53

1

你压缩什么样的数据?某些数据压缩得不好,例如JPEG或压缩的ZIP文件。

+1

这是所有普通文件的混乱。文档,图片,下载,pdf等。公司中的每个人都有一个共享驱动器到服务器。我想要备份服务器上的所有文件。 – David 2011-01-26 16:00:19

+2

docx,xl​​sx文件等也是zip文件。大多数图片格式都被压缩。我的猜测是大多数源文件都是不可压缩的。 – phoog 2011-01-31 01:32:47