c# - DotNetZip 无法压缩大量条目

标签 c# .net compression zip dotnetzip

我通过以下方式使用 dotnet zip:

using (ZipFile zip = new ZipFile(@"E:\test2.zip"))
{
      zip.ParallelDeflateThreshold = -1;
      zip.UseZip64WhenSaving = Zip64Option.Always;
      zip.SaveProgress += SaveProgress;
      zip.AddDirectory(@"E:\Samples");
      zip.Save(@"E:\test2.zip");
}

在我尝试压缩一个包含近 100 万个文件的目录之前,这段代码工作正常。

场景:

1. 如果文件比较重:

该文件夹在分配的子目录中包含 928614 个文件,整个文件夹大小为 134GB,但大多数文件只有几 kb,最大的一个约 60 mb。

应用程序在文件 870000 周围的保存操作期间卡住。我通过监听进度事件知道这一点。

public void SaveProgress(对象发送者,SaveProgressEventArgs e) {

    if (e.EntriesSaved != 0)
    {
        System.Console.WriteLine(e.EntriesSaved.ToString());
    }

我让应用程序运行了一整夜,但什么也没发生,在一次测试运行中,应用程序完全崩溃(就像有人在 visual studio 中按 CTRL F5)

我还尝试运行 dotnetzip 工具包提供的 ZipIt.exe,同样的事情发生了。

2.如果文件很小(测试目的)

压缩包包含 970000 个文件,分布在子目录中,所有文件都是一个带有字母“a”的 txt 文件,完整文件夹大小为 1mb。

保存操作遍历所有文件(正如我使用 saveProgress 事件所见) 但最后我得到了一个outofmemoryexception

我还尝试运行 dotnetzip 工具包提供的 ZipIt.exe,在这种情况下操作成功完成(太困惑了!)

dotnetzip 是否支持最大数量?有解决办法吗? 非常感谢。

最佳答案

原始 ZIP 规范允许在 zip 存档中最多包含 65535 个条目。您应该为存档启用 Zip64:

myZipFile.UseZip64WhenSaving = Zip64Option.AsNecessary;

关于c# - DotNetZip 无法压缩大量条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633896/

相关文章:

c# - C#动态创建表的方法

c# - 以正确的方式实现异步 "yielding"

c# - 我如何遍历我的类属性并获取它们的类型?

c# - 除了触发存储过程 368 次来更新数据库之外,还有什么好的替代方法?

c# - 带有 SOS 的 Windbg,如何转储 c# 结构

c# - 使用 TCP 套接字在本地代理视频

.net - System.IO.Compression和ZipFile-提取并覆盖

c# - 列表上的异步函数

c# - HttpClient Gzip 压缩

c# - 如何使用 dotnetzip 检查文件是否存在于 zip 文件中