Wie verzweige ich einen Stream in .NET?

8

Als Wenn ein BinaryReader oder BinaryWriter geschlossen wird, wird sein zugrunde liegender Stream ebenfalls geschlossen (aargh). Betrachten Sie diese Situation: Eine Routine R wird einem MemoryStream übergeben, sagen wir M ; Ich würde gerne ein paar Sachen in M schreiben und sie dann an eine andere Routine weiterverarbeiten (nicht unbedingt schreiben). Aus praktischen Gründen möchte ich M in einen BinaryWriter einbinden, um meine Texte zu schreiben. Nach dem Schreiben bin ich fertig mit dem BinaryWriter, aber nicht mit M .

%Vor%

Aber ich kann nicht über den BinaryStream verfügen, ohne M zu schließen.

F: Gibt es eine Möglichkeit, Folgendes zu tun?

  • Extrahiere das zugrunde liegende Byte [] aus einem MemoryStream,
  • Klone einen Stream
  • Öffnen Sie einen Stream, nachdem er geschlossen wurde
I. J. Kennedy 27.10.2009, 21:04
quelle

7 Antworten

2

Dank einiger, die ToArray vorgeschlagen haben, wurde ich zur richtigen Antwort geführt, die "M.GetBuffer" ist. ToArray ist nicht so schlimm, aber es

  • erstellt eine Kopie
  • erhält nur einen Teil des Puffers

GetBuffer ruft nur einen Verweis auf das zugrunde liegende Byte [] ab, und genau danach möchte ich suchen.

    
I. J. Kennedy 27.10.2009, 21:21
quelle
7

Sie sollten besser den zugrunde liegenden Byte [] Puffer mit

erhalten %Vor%

Kopieren Sie dann die Byte-Daten mit der Array.Copy () -Methode. Sie können damit einen neuen Stream erstellen.

    
Ricardo Amores 27.10.2009 21:17
quelle
5

Sie können Dinge wie das MiscUtil.IO.NonClosingStreamWrapper in MiscUtil verwenden, das ein Stream einfach umschließt ignoriert Close / Dispose -Anfragen. Für genau diesen Zweck.

%Vor%     
Marc Gravell 27.10.2009 21:40
quelle
2

Sie können:

  • Rufen Sie M.ToArray () auf, um den Stream als Array von Bytes zu erhalten.
  • Subclass BinaryWriter und überschreiben Sie die Dispose-Methode, um das Schließen des untergeordneten Streams zu verhindern
Chris 27.10.2009 21:10
quelle
1

Nur um es hier hinzuzufügen, wäre eine sehr einfache Lösung nicht , um den Writer zu dispose ().

%Vor%

Jetzt müssen Sie sich nur noch darum kümmern, B im Gültigkeitsbereich zu behalten, was während R () sein wird.

Dies mag hier nicht die beste Lösung sein, aber es ist erwähnenswert, dass die Leser und Autoren nicht selbst disponieren müssen.

    
Henk Holterman 27.10.2009 21:42
quelle
0

Ein etwas naive Ansatz ist es,

zu verwenden %Vor%

So kopieren Sie den Stream-Inhalt in ein Byte-Array. Sie können es mit

in einen Stream zurückverwandeln %Vor%     
David Lively 27.10.2009 21:10
quelle
-1

Nach diesem M.Clone (); sollte arbeiten. Aber ich könnte falsch liegen ...

    
Ilya Khaprov 27.10.2009 21:12
quelle

Tags und Links