在C#中将.bz2流解压缩到文件

时间:2012-12-22 00:14:58

标签: c# sharpziplib bzip2

我在尝试使用SharpZipLib库中的.bz2内容时遇到了麻烦,我无法在其他地方找到任何帮助。

任何帮助或建议都会非常感激,如果有人能指出我现有的解决方案,我可以从中学到很棒!

以下是我正在尝试做的事情,但显然它不起作用。目前我遇到的问题是在标记的行上未处理'EndOfStreamException'。代码有点混乱,我以前从未试图做过这样的事情......

你可以告诉我在解压缩之前从网上下载这个,我很确定部分代码可以正常工作。

while ((inputByte = responseStream.ReadByte()) != -1)
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (BinaryWriter writer = new BinaryWriter(ms))
        {
            writer.Write((byte)inputByte);
        }

        using (BZip2InputStream unzip = new BZip2InputStream(ms)) //Exception occurs here
        {
            buffer = new byte[unzip.Length];
            unzip.Read(buffer, 0, buffer.Length);
        }

        using (FileStream fs = new FileStream(fPath, FileMode.OpenOrCreate, FileAccess.Write))
        {
            fs.Write(buffer, 0, buffer.Length);
        }

    }
}

2 个答案:

答案 0 :(得分:2)

您正在使用using语句。 using语句是编译器指令,try finally包含在代码块中,IDisposible.Dispose()将在执行finally时被调用。

长话短说,在BinaryWriterBZip2InputStreamFileStream上调用dispose可能会过早地处置父MemoryStream

尝试从using中删除三个MemoryStream块,看看是否能解决您的问题。

修改

您的BinaryWriter正在向byte写一个MemoryStream。我认为您不需要BinaryWriter因为MemoryStreamWriteByte()方法。

然后您的BZip2InputStream正试图从MemoryStream中读取。但是MemoryStream在流的末尾有它的位置。没有要读取的数据,因此EndOfStreamException

答案 1 :(得分:0)

OP的代码中有两个问题。 第一个,正如Jason Whitted提到的,using的{​​{1}}代码块导致BinaryWriter实例的处置,因此我们应该删除该块并因为MemoryStream本身具有MemoryStream方法,所以可以使用以下方法以最干净的方式实现:

write

第二个问题是,当我们写入var ms = new MemoryStream(); ms.Write(inputBytes,0,inputBytes.Length); 实例(ms)时,我们会转到它的结尾,因此在尝试使用MemoryStream之前,我们必须将位置改回到内存流的开头:

BZip2InputStream