【问题标题】:ZipArchiveMode.Update never completes for very large files对于非常大的文件,ZipArchiveMode.Update 永远不会完成
【发布时间】:2015-07-08 10:00:34
【问题描述】:

我有这个代码,其中zipfilename 是现有的 Zip 文件,sourceFile 是我要压缩的文件,filename 是存档条目名称。

using (ZipArchive archive = ZipFile.Open(zipfilename, ZipArchiveMode.Update))
{
    await Task.Run(() => archive.CreateEntryFromFile(sourceFile, filename, CompressionLevel.Fastest));
}

这适用于不超过 50KB 的小文件。对于这些,将文件压缩到存档中没有问题。我可以通过这种方式添加任意数量的小文件。

但是对于大小为 1.8GB 的​​非常大的文件,内存消耗会高达数 GB,并且文件从未真正压缩到存档中。

如何更好地将大文件压缩到现有的目标存档中?请注意,我需要使用现有的目标 zip/存档文件,并且它必须是 .zip。

【问题讨论】:

  • 你使用什么压缩库?
  • 我正在使用 System.IO.Compression。我知道一些 Nuget 包,但读到大文件存在稳定性问题..
  • 我不确定,但 system.Io.compression 可能不支持 zip64 格式,它打破了 32 位指针的最大可寻址大小的限制(即 uint 4GB,int 2GB)。但是,它没有解释为什么 1.8 GB 的文件不会压缩。
  • Nuget 上提供的 SharpZipLib 确实比 System.IO.Compression 更好地处理大文件。
  • 好的,现在有了 SharpZipLib,我要绕圈子了。我最初可以更好地处理压缩大文件,但我似乎无法让它将文件添加到可能以小文件开始的现有存档中。发生的情况是小文件被存档中的大文件覆盖。我应该发布一个新问题吗?或者我应该用示例代码更新这个问题..

标签: c# zipfile ziparchive


【解决方案1】:

我知道这有点太晚了。但是,不要使用ZipArchiveMode.Update,为什么不将存档文件解压缩到一个临时文件夹中,删除 zip 并使用 ZipArchiveMode.Create 将所有文件(包括临时文件夹中的文件)一起压缩(如果您正在使用现有的拉链)。这将是一个更快的过程,并且可以处理更大的目标 zip。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多