2016-06-17 2 views
1

を閉じて、ストリームにはzlib圧縮データ及びいくつかの余分なデータを書き込むための私のC#メソッドです:compressor.Close()が呼び出されるとDeflateStreamは、ここで入力ストリーム

using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress)) { 
    compressor.Write(input, 0, input.Length); 
    compressor.Close(); 
    compessStream.Write(extraData, 0, extraData.Length); 
    } 

、それが自動的に入力ストリームを閉じます。その結果、ストリームに余分なデータを書き込むことはできません。

余分なデータを書き込んだ後にコンプレッサーを閉じると、データの順序が無効になります。私の余分なデータは圧縮されたデータの前に書かれています。

なぜDeflateStream.Close()も入力ストリームを閉じますか?実際のストリームクラスをラップし、後者が閉じないようにするストリームクラスを記述するのに手間がかかりますか?よろしく。デフォルトでは

[__DynamicallyInvokable] 
protected override void Dispose(bool disposing) 
{ 
    try { 
     this.PurgeBuffers(disposing); 
    } 
    finally { 
     try { 
      if (disposing && !this._leaveOpen && this._stream != null) { 
       this._stream.Close(); 
      } 
     } 
     finally { 
      this._stream = null; 
      try { 
       if (this.deflater != null) { 
        this.deflater.Dispose(); 
       } 
      } 
      finally { 
       this.deflater = null; 
       base.Dispose(disposing); 
      } 
     } 
    } 
} 

は、DeflateStreamは、基になるストリームを所有しているので、また、ストリームを閉じ、ストリームを閉じる:/クローズそれはこのように設計するので廃棄する際

+3

'新しいDeflateStream(compressStream、CompressionMode.Compress、leaveOpen:真)' – PetSerAl

答えて

0

DeflateStreamは、基になるストリームを閉じます。

あなたが開い基になるストリームを残すことができるようDeflateStreamためspecific constructorを使用してこの動作を制御することができます

public DeflateStream(
    Stream stream, 
    CompressionMode mode, 
    bool leaveOpen 
) 
+0

パラメータ」 leaveOpen "がそのトリックをしました。ありがとうございました。 – Peter

関連する問題