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

C# 在C中将.bz2流解压缩到文件#,c#,sharpziplib,bzip2,C#,Sharpziplib,Bzip2,我在尝试使用SharpZipLib库中的.bz2内容时遇到了真正的困难,我在其他地方找不到任何帮助 任何帮助或建议都将不胜感激,如果有人能告诉我一个现有的解决方案,我可以从中学习,那将是非常棒的 下面是我试图做的,但显然它不起作用。目前我遇到的问题是在标记行上未处理“EndOfStreamException”。代码有点乱七八糟,我以前从未尝试过这样做 正如您可能知道的那样,我在解压缩之前是从网上下载的,但我相当确信部分代码工作正常 while ((inputByte = responseStre

我在尝试使用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);
        }

    }
}

您正在使用
语句<代码>使用
语句是编译器指令,用于将
try finally
包装在代码块周围,执行
finally
时将调用
IDisposable.Dispose()

长话短说,在
BinaryWriter
上调用dispose、
BZip2InputStream
FileStream
可能过早地处理父
内存流

尝试使用
MemoryStream
中的
块删除这三个
,看看这是否解决了您的问题

编辑

您的
二进制编写器
正在向
内存流
写入单个
字节
。我认为您不需要一个
BinaryWriter
,因为
MemoryStream
有一个
WriteByte()
方法


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

OP的代码中有两个问题第一个,正如Jason Whitted提到的,
使用
二进制编写器的
代码块
会导致
内存流
实例的处理,因此我们应该删除该块,因为
内存流
本身有一个
写入
方法,这可以通过以下方式以最干净的方式实现:

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

ms.Seek(0, SeekOrigin.Begin); //THIS IS NECESSARY to change the position to the beginning
byte[] buffer = null;
using (var bz2InputStream = new BZip2InputStream(ms))
{
       buffer = new byte[bz2InputStream.Length];
       bz2InputStream.Read(buffer, 0, buffer.Length);
}

只是尝试了这个,不幸的是,这似乎并没有真正解决问题,但我甚至没有考虑到这一点。谢谢您的建议。您仍然收到
EndOfStreamException
?是哪一行?是的,对不起。创建BZIP2InputStream时,它与以前完全相同。我相信上次我查看SharpZipLib时,它不再受支持。而IIRC无论是打包还是解包都表现得非常糟糕。我见过的最流行的免费.NETZIP库是。我不确定这是否是一个选择,但它可能值得研究。哦,哇,是的,我现在明白你的意思了。。。非常好的帮助,非常感谢!现在都开始工作了!