2010-10-28 99 views
4

我正在尝试使用GZipStream来编写一些应用程序跟踪(它们倾向于在生产中增长到巨大)。所以在这种情况下,我需要能够打开一个现有的文件,并使用GZipStream追加到它。在我们尝试解压文件之前,所有的东西似乎都运行良好。看来在解压缩时,GZipStream只读取第一块数据,然后表现得像EOF(即使文件包含更多)。奇怪的是,当使用Windows或Winrar打开文件时,所有数据似乎都存在并被正确提取。 有没有人遇到过这个问题?使用GZipStream追加压缩文件

+0

可能重复[追加到压缩流](http://stackoverflow.com/questions/4046011/append-toa-a-压缩流) – 2011-05-27 12:13:50

回答

2

我遇到了同样的问题。 这个想法是实现像http://zlib.net/pigz/那样的东西

+1

我会接受这一点,但在目前的形式它不提供很多信息,除了“去那个链接”。如果你喜欢编辑它并解释一下zlib的作用,以及如何应用在这种情况下,你会得到接受:) - 这不像是有很多竞争者 – 2012-10-25 13:01:46

+0

这不是我接受和接受积分囤积,我只是喜欢SOF居民互相帮助:) 这个想法是删除旧的gzip块(页脚)的最后8个字节,从页脚中提取CRC和大小,然后添加一些零,然后添加新的块然后重新计算新旧块大小和CRC的源大小和CRC,并替换所产生的页脚。这里的问题是,我没有找到如何根据两部分CRC进行有效总和的CRC。另外新的块需要首先移除它的头部。 – 2012-10-25 21:49:06

+0

pigz做的也是在大块之间共享一些字典数据,并且它完成了上述所有内容,因此您可以查看源代码。如果你已经用.NET实现了,请告诉我,我已经放弃了这种方法,并添加了块分隔符和一个读取程序,它可以逐块提供数据进行解压缩。 – 2012-10-25 21:51:28

0

这花了我花了很长时间才弄清楚。标准的C#实现,GZipStream有一个bug,它不支持连接的gzip文件。它只会解压缩由串联创建的gzip文件的第一部分,并在此之后报告流结束。

这里是将为串连的gzip文件的示例:

new StreamReader(new ICSharpCode.SharpZipLib.GZip.GZipInputStream(Console.OpenStandardInput())); 

你可以得到你的NuGet需要的库。我推荐jetbrain的版本,JetBrains.SharpZLib.Stripped。当我尝试使用.net核心项目中的其他选项时,Nuget抛出错误