5

我将尝试使用带有 106 个图像 (675MB) 的 DotNetZip-Libary 使用以下代码创建一个 zip 文件:

Public Function GetZip() As Byte()
    Dim zip As New Ionic.Zip.ZipFile(String.Format("{0}.zip", Me.GallerySystemName))
    AddHandler zip.SaveProgress, AddressOf SaveProgress

    For Each img In Me.Images
        zip.AddFile(img.OriginalFile.FullName, "")
    Next

    Dim bytZip As Byte()

    Using ms As New MemoryStream
        zip.Save(ms)
        bytZip = ms.ToArray
    End Using

    Return bytZip
End Function

当我运行此代码时,执行通常在图像 40(有时更早)处停止,没有任何异常。什么都没发生。我试图将 zip 直接保存到文件中。有用。

有任何想法吗?

4

2 回答 2

16

在保存 zip 文件之前将 zip 对象属性设置ParallelDeflateThreshold-1

zip.ParallelDeflateThreshold = -1



参考:http ://forums.codeguru.com/showthread.php?534177-Issue-with-DotNetZip-ionic.zip-class-hanging-on-save

于 2014-02-25T06:18:01.413 回答
9

自您提出问题以来已经快 2 年了,所以我怀疑这会有所帮助,但我刚刚在 v1.9.1.8 中遇到了同样的问题。

我通过将BufferSizeCodecBufferSize ZipFile 属性分别增加到 1MB 来解决这个问题。

由于工作中的过滤器,我无法下载 DotNetZip 源代码,但这里有一条来自http://dotnetzip.codeplex.com/releases/view/68268的很可能相关的评论

代码中有一个相当大的错误。我正在努力弄清楚。另一个小伙子在我面前记录了它: ParallelDeflateOutputStream.EmitPendingBuffers 中的死锁 zip 挂起。一天结束时,我将不得不删除这段代码并重新开始一个新的库。我需要打电话给我的上一份工作,并给他们一个提示 b/c 我在上一份工作中使用了这个库。他们也可能不得不撕掉代码。jnarkiewicz 发表于 5 月 30 日下午 6:31

因此,如果这确实是问题所在,那么增加这些缓冲区的大小只会降低发生死锁的可能性,并不是一个理想的解决方案。

于 2012-11-14T18:14:30.137 回答