Ionic.Zip(DotNetZip)在使用IO.MemoryStream的save方法中挂起

时间:2011-01-16 21:59:29

标签: vb.net memorystream dotnetzip

我将尝试使用带有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直接保存到文件中。有用。

有什么想法吗?

2 个答案:

答案 0 :(得分:15)

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

zip.ParallelDeflateThreshold = -1



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

答案 1 :(得分:9)

你的问题已经差不多2年了,所以我怀疑这会有所帮助,但我在v1.9.1.8中遇到了同样的问题。

我通过将 BufferSize CodecBufferSize ZipFile属性增加到每个1MB来解决这个问题。

我无法下载DotNetZip来源,因为过滤器在工作,但这是一个非常可能相关的评论来自http://dotnetzip.codeplex.com/releases/view/68268

  

代码中存在一个相当大的错误。我正在努力解决这个问题。另一个人在我之前记录了它:ParallelDeflateOutputStream.EmitPendingBuffers中的死锁zip挂起。在今天结束时,我将不得不翻录这个代码并重新开始使用新库。我需要打电话给我的上一份工作并给他们一个头脑,我在上一份工作中使用了这个库。他们可能也不得不撕掉代码。   作者:jnarkiewicz于5月30日下午6:31

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

相关问题