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
.
Aber ich kann nicht über den BinaryStream verfügen, ohne M
zu schließen.
F: Gibt es eine Möglichkeit, Folgendes zu tun?
Dank einiger, die ToArray vorgeschlagen haben, wurde ich zur richtigen Antwort geführt, die "M.GetBuffer" ist. ToArray ist nicht so schlimm, aber es
GetBuffer ruft nur einen Verweis auf das zugrunde liegende Byte [] ab, und genau danach möchte ich suchen.
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.
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.
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.
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%Nach diesem M.Clone (); sollte arbeiten. Aber ich könnte falsch liegen ...
Tags und Links c# stream clone memorystream