GZipStream无法读取整个文件

10

我有一些下载并解压缩gzipped文件的代码。问题是,我无法将其完全解压缩,它只读取前4096个字节,然后大约还有500个字节。

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文件的开头部分。
请问有人知道为什么会发生这种情况吗?

我记得在编写解压缩程序时遇到过这个问题。不过,我看了一下最终的工作代码,除了被包裹在“using”块中之外,它看起来和你的代码一样。 - David Neale
3
你是在调用Flush()方法吗? - n535
尝试使用Flush(),但没有帮助。 - Edgar
4个回答

4

编辑

尝试不要保持GZipStream开启状态:

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

或者

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

是的,我已经尝试过CopyTo()。结果还是一样。我不知道为什么它无法读取更多的内容。 - Edgar
尝试使用了using语句,但没有改变。 - Edgar
尝试不保持GZipStream打开,但没有改变。 - Edgar

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);
            }

        }
    }
} 

1

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


你能发一下你的最终版本吗?我想看看你如何使用gzip可执行文件。 - ManInMoon
抱歉,我无法再访问该代码了。它使用Process类调用gzip可执行文件。这可能会有所帮助:http://www.dotnetperls.com/7-zip - Edgar

0
你是否在 fileOutput 上调用了 CloseFlush?(或者只需将其包装在 using 中,这是推荐的做法。)如果没有,当程序结束时,文件可能不会被刷新到磁盘上。

读取完成后,所有3个流都被关闭。问题不在于数据没有正确写入输出文件,而是Read()没有完全读取输入文件。可能有什么东西在中断它吗?每次在停止之前它都会读取确切的字节数,这很奇怪。 - Edgar
第一次读取后为4096,第二次读取为532,然后停止。 - Edgar
尝试在 cctor 中不要保持流处于打开状态。 - David Neale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接