gpt4 book ai didi

c# - DotNetZip 中大量文件的压缩问题

转载 作者:太空狗 更新时间:2023-10-30 01:10:24 27 4
gpt4 key购买 nike

问候....

我正在用 c# 3.5 编写一个备份程序,使用的是最新的 DotNetZip。该程序的基础是在服务器上指定一个位置和跨区 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();
}

感谢您的帮助!

最佳答案

1.Given the below code and the large amount of files in an archive, should I compress each file as it is added to the zip?

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

or should the Adddirectory method provide about the same compression?

通过 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 时是否进行了压缩。

关于c# - DotNetZip 中大量文件的压缩问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4795603/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com