6

SharpZipLibライブラリの.bz2を使用しようとして本当に問題があり、他の場所でヘルプを見つけることができませんでした。

どんな助けやアドバイスも大歓迎です、そして誰かが私に既存の解決策を指摘することができれば私はそれから学ぶことができます素晴らしいでしょう!

以下は私がやろうとしていることですが、明らかにそれは機能していません。現在私が抱えている問題は、マークされた行で「EndOfStreamException」が処理されていないことです。コードは少し混乱しています、私はこれまでこのようなことをしようとしたことがありません...

解凍する前にこれをWebからダウンロードしていることがわかると思いますが、コードの一部は正しく機能していると確信しています。

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

    }
}
4

2 に答える 2

3

usingステートメント を使用しています。usingステートメントはtry finally、コードのブロックをラップするためのコンパイラ指令でありIDisposible.Dispose()、が実行されるときに呼び出さfinallyれます。

簡単に言うと、、、を呼び出してBinaryWriter、親を早めに破棄している可能性がありBZip2InputStreamます。FileStreamMemoryStream

using内から3つのブロックを削除してみてMemoryStream、問題が解決するかどうかを確認してください。

編集

あなたはにシングルをBinaryWriter書いています。方法があるので、これには必要ないと思います。byteMemoryStreamBinaryWriterMemoryStreamWriteByte()

次に、BZip2InputStreamから読み取ろうとしていMemoryStreamます。しかし、MemoryStreamそれはストリームの終わりに位置しています。読み取るデータがないため、EndOfStreamException

于 2012-12-22T00:22:25.923 に答える
0

OPのコードには2つの問題があります。最初の1つは、Jason Whittedが述べたように、インスタンスの原因の破棄のusingコードブロックであるため、ブロックを削除する必要があります。ブロック自体にメソッドがあるため、これは次の方法を使用して最もクリーンな方法で実現できます。BinaryWriterMemoryStreamMemoryStreamwrite

var ms = new MemoryStream();
ms.Write(inputBytes,0,inputBytes.Length); 

2番目の問題は、インスタンス(ms)に書き込むときにMemoryStreamインスタンスの最後に移動するため、使用する前に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);
}
于 2018-10-09T12:33:37.667 に答える