2016-06-17 14 views
1

Hier ist meine C# Methode zlib-komprimierte Daten und zusätzliche Daten in einen Stream zu schreiben:DeflateStream schließt den Eingangsstrom

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

Wenn compressor.Close() genannt wird, schließt er automatisch den Eingangsstrom. Daher kann ich keine zusätzlichen Daten in den Stream schreiben.

Wenn ich den Kompressor nach dem Schreiben meiner zusätzlichen Daten schließe, ist die Reihenfolge der Daten nicht mehr gültig. Meine zusätzlichen Daten werden vor den komprimierten Daten geschrieben und nicht wie ich es beabsichtigt habe.

Warum schließt DeflateStream.Close() auch den Eingangsstrom? Gibt es eine Möglichkeit, es zu umgehen, ohne eine Stream-Klasse zu schreiben, die die tatsächliche Stream-Klasse umschließt und verhindert, dass diese geschlossen wird? Grüße.

+3

'neue DeflateStream (compressStream, CompressionMode.Compress, Leaveopen: true)' – PetSerAl

Antwort

0

Die DeflateStream schließen Sie die zugrunde liegenden Stream beim Schließen/Entsorgung, da es auf diese Weise gestaltet:

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

standardmäßig besitzt DeflateStream den zugrunde liegenden Stream, schließen so den Strom schließt auch die zugrunde liegenden Stream.

Sie dieses Verhalten mit Hilfe der specific constructor für die DeflateStream steuern kann, dass Sie den zugrunde liegenden Stream offen lassen:

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

Parameter " leaveOpen "hat es geschafft. Vielen Dank. – Peter

Verwandte Themen