2010-06-18 42 views
7

我有一些下载gzip文件的代码,并解压缩它们。问题是,我无法解压缩整个文件,只能读取前4096个字节,然后再读取约500个字节。GZipStream没有读取整个文件

Byte[] buffer = new Byte[4096]; 
int count = 0; 
FileStream fileInput = new FileStream("input.gzip", FileMode.Open, FileAccess.Read, FileShare.Read); 
FileStream fileOutput = new FileStream("output.dat", FileMode.Create, FileAccess.Write, FileShare.None); 
GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, true); 

// Read from gzip steam 
while ((count = gzipStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    // Write to output file 
    fileOutput.Write(buffer, 0, count); 
} 

// Close the streams 
... 

我检查了下载的文件;压缩时为13MB,并包含一个XML文件。我已经手动解压缩了XML文件,并且内容都在那里。但是,当我使用此代码执行此操作时,它仅输出XML文件的最开始部分。

任何人有任何想法,为什么这可能会发生?

+0

当我在写一个解压缩程序我记得得到这个问题。不过,我已经看到了我最终使用的工作代码,除了被'使用'块封装之外,它看起来像你的。 – 2010-06-18 09:20:18

+3

你在调用Flush()方法吗? – n535 2010-06-18 09:20:31

+0

尝试冲洗(),没有帮助。 – Edgar 2010-06-18 09:26:35

回答

1

我最终使用gzip可执行文件来进行解压缩而不是GZipStream。由于某些原因它无法处理该文件,但可执行文件可以。

+0

您能否发布您的最终版本。我想看看你如何使用gzip可执行文件。 – ManInMoon 2014-11-19 11:07:39

+0

对不起,我无法再访问该代码。它使用Process类来调用gzip可执行文件。这可能有助于:http://www.dotnetperls.com/7-zip – Edgar 2014-11-20 07:42:39

4

编辑

尽量不要离开GZipStream开:

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, 
                     false); 

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress); 
+0

是的,我试过CopyTo()。结果是一样的。我不知道为什么它不能读得比它更多。 – Edgar 2010-06-18 09:47:25

+0

尝试使用语句;不用找了。 – Edgar 2010-06-18 10:00:47

+0

尝试不离开GZipStream打开;不用找了。 – Edgar 2010-06-18 10:47:37

0

你叫上fileOutputCloseFlush? (或者将其包装在using中,这是推荐的做法。)如果您没有在程序结束时文件可能未刷新到磁盘。

+0

读完后,所有3个流都关闭。问题不在于数据没有正确写入输出文件,而是Read()不读取整个输入文件。 可能会打断它吗?它在每次停止前都会读取确切的字节数,这很好奇。 – Edgar 2010-06-18 09:50:32

+0

第一次阅读后'count'的值是多少? – 2010-06-18 10:06:28

+0

第一次读取4096后,第二次读取532,然后停止。 – Edgar 2010-06-18 10:14:15

1

同样的事情发生在我身上。在我的情况下,最多只能读取6行,然后到达文件结尾。所以我意识到,虽然扩展名是gz,但它被另一种不受GZipStream支持的算法压缩。所以我用SevenZipSharp库,它的工作。这是我的代码

您可以使用SevenZipSharp库

using (var input = File.OpenRead(lstFiles[0])) 
{ 
    using (var ds = new SevenZipExtractor(input)) 
    { 
     //ds.ExtractionFinished += DsOnExtractionFinished; 

     var mem = new MemoryStream(); 
     ds.ExtractFile(0, mem); 

     using (var sr = new StreamReader(mem)) 
     { 
      var iCount = 0; 
      String line; 
      mem.Position = 0; 
      while ((line = sr.ReadLine()) != null && iCount < 100) 
      { 
       iCount++; 
       LstOutput.Items.Add(line); 
      } 

     } 
    } 
}