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();  
}  

感谢您的任何帮助!

4

3 回答 3

2

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

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

于 2011-01-25T16:25:35.543 回答
2

1.鉴于以下代码和存档中的大量文件,我是否应该在将每个文件添加到 zip 时对其进行压缩?

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

还是应该 Adddirectory 方法提供大约相同的压缩?

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


一个不请自来的提示:您不需要这样做:

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

你可以这样做:

zip.AddProgress += Zip_AddProgress;   

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

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

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

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


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

于 2011-01-31T00:22:41.363 回答
1

你在压缩什么类型的数据?某些类型的数据不能很好地压缩,例如 JPEG 或已经压缩的 ZIP 文件。

于 2011-01-25T16:59:57.880 回答