Wenn Sie in einer Datei speichern müssen, warum verwenden Sie eine MemoryStream?
Oded
@Oded Was soll ich verwenden? Kannst du mir ein Beispiel geben?
Mahdi Ghiasi
Antworten:
365
Sie können MemoryStream.WriteTooder Stream.CopyTo(in Framework-Version 4.5.2, 4.5.1, 4.5, 4 unterstützt) Methoden verwenden, um Inhalte des Speicherstroms in einen anderen Stream zu schreiben.
memoryStream.CopyTo schien bei mir nicht zu funktionieren, während WriteTo es tat. Ich denke, vielleicht lag es daran, dass mein memoryStream.Position nicht 0 war
Mark Adamson
10
Ja, das ist richtig. Der Unterschied zwischen ihnen besteht darin, dass CopyTo von jeder aktuellen Position kopiert wird, anstatt immer von Anfang an wie WriteTo.
using (FileStream file =newFileStream("file.bin",FileMode.Create,System.IO.FileAccess.Write)){byte[] bytes =newbyte[ms.Length];
ms.Read(bytes,0,(int)ms.Length);
file.Write(bytes,0, bytes.Length);
ms.Close();}
und dies liest eine Datei in einen MemoryStream:
using (MemoryStream ms =newMemoryStream())
using (FileStream file =newFileStream("file.bin",FileMode.Open,FileAccess.Read)){byte[] bytes =newbyte[file.Length];
file.Read(bytes,0,(int)file.Length);
ms.Write(bytes,0,(int)file.Length);}
In .Net Framework 4+ können Sie FileStream einfach in MemoryStream kopieren und so einfach umkehren:
MemoryStream ms =newMemoryStream();
using (FileStream file =newFileStream("file.bin",FileMode.Open,FileAccess.Read))
file.CopyTo(ms);
Und die Umkehrung (MemoryStream zu FileStream):
using (FileStream file =newFileStream("file.bin",FileMode.Create,System.IO.FileAccess.Write))
ms.CopyTo(file);
Kann ich fragen, warum Sie FileMode.Create im Lesebeispiel gegen FileMode.Open verwenden?
Philter
6
Anstatt den Speicherstrom manuell in ein Array zu kopieren, können Sie im ersten Codeblock die integrierte ms.ToArray()Funktion verwenden.
Gman
5
Es ist wichtig, ms.Position = 0 zu setzen, da sonst das Byte-Array (und die Datei) alle Nullen enthalten.
Gregory Khrapunovich
1
@ Fernando68 das Konstrukt using (...){ }hat genau den gleichen Effekt.
Fabricio Araujo
2
Nur als Warnung an andere, die (FileStream 'und' ms.CopyTo (file) 'verwenden, wird die Position am Ende der Datei festgelegt, und Sie müssen den Memorystream anschließend zurücksetzen
Rebecca,
63
Der Stream sollte wirklich entsorgt werden, auch wenn es eine Ausnahme gibt (sehr wahrscheinlich bei Datei-E / A). Die Verwendung von Klauseln ist mein bevorzugter Ansatz, sodass Sie zum Schreiben Ihres MemoryStream Folgendes verwenden können:
using (FileStream file =newFileStream("file.bin",FileMode.Create,FileAccess.Write)){
memoryStream.WriteTo(file);}
Und zum Zurücklesen:
using (FileStream file =newFileStream("file.bin",FileMode.Open,FileAccess.Read)){byte[] bytes =newbyte[file.Length];
file.Read(bytes,0,(int)file.Length);
ms.Write(bytes,0,(int)file.Length);}
Wenn die Dateien groß sind, ist zu beachten, dass der Lesevorgang doppelt so viel Speicher benötigt wie die gesamte Dateigröße . Eine Lösung hierfür besteht darin, den MemoryStream aus dem Byte-Array zu erstellen. Im folgenden Code wird davon ausgegangen, dass Sie dann nicht in diesen Stream schreiben.
MemoryStream ms =newMemoryStream(bytes, writable:false);
Meine Forschung (unten) zeigt, dass der interne Puffer das gleiche Byte-Array ist, mit dem Sie ihn übergeben, sodass Speicherplatz gespart werden sollte.
byte[] testData =newbyte[]{104,105,121,97};var ms =newMemoryStream(testData,0,4,false,true);Assert.AreSame(testData, ms.GetBuffer());
Car car =newCar();
car.Name="Some fancy car";MemoryStream stream =Serializer.SerializeToStream(car);System.IO.File.WriteAllBytes(fileName, stream.ToArray());
Laden aus einer Datei
using (var stream =newMemoryStream(System.IO.File.ReadAllBytes(fileName))){Car car =(Car)Serializer.DeserializeFromStream(stream);}
wo
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace Serialization{publicclassSerializer{publicstaticMemoryStreamSerializeToStream(object o){MemoryStream stream =newMemoryStream();IFormatter formatter =newBinaryFormatter();
formatter.Serialize(stream, o);return stream;}publicstaticobjectDeserializeFromStream(MemoryStream stream){IFormatter formatter =newBinaryFormatter();
stream.Seek(0,SeekOrigin.Begin);object o = formatter.Deserialize(stream);return o;}}}
Wenn eine Datei in Microsoft Word geöffnet wird - gibt es eine Möglichkeit, aus dieser Datei einen Speicherstrom zu erstellen? Ich
erhalte die
@FrenkyB Ich stoße auch oft darauf. Wenn Sie die Datei in Word oder einer anderen App geöffnet haben, können Sie dies nicht tun. Schließen Sie einfach die Datei in Word.
Kristopher
@FrenkyB Kannst du eine File.Copy machen? Ich habe festgestellt, dass das funktioniert, dann aus dieser Datei in einen Stream gelesen und die neue Datei gelöscht ... schrecklich, scheint aber zu funktionieren.
Ridecar2
3
Ich verwende ein Bedienfeld, um ein Bild hinzuzufügen oder sogar Videos zu streamen, aber Sie können das Bild auf SQL Server als Image oder MySQL als Largeblob speichern . Dieser Code funktioniert bei mir sehr. Hör zu.
Hier speichern Sie das Bild
MemoryStream ms =newMemoryStream();Bitmap bmp =newBitmap(panel1.Width, panel1.Height);
panel1.DrawToBitmap(bmp, panel1.Bounds);
bmp.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);// here you can change the Image formatbyte[]Pic_arr=newbyte[ms.Length];
ms.Position=0;
ms.Read(Pic_arr,0,Pic_arr.Length);
ms.Close();
Und hier können Sie laden, aber ich habe ein PictureBox-Steuerelement verwendet.
MemoryStream ms =newMemoryStream(picarr);
ms.Seek(0,SeekOrigin.Begin);
fotos.pictureBox1.Image=System.Drawing.Image.FromStream(ms);
MemoryStream
?Antworten:
Sie können
MemoryStream.WriteTo
oderStream.CopyTo
(in Framework-Version 4.5.2, 4.5.1, 4.5, 4 unterstützt) Methoden verwenden, um Inhalte des Speicherstroms in einen anderen Stream zu schreiben.Aktualisieren:
quelle
[file|memory]Stream.Seek(0, SeekOrigin.Begin);
bevorCopyTo
die aktuelle Position auf 0 gesetzt, so dassCopyTo
der kompletten Strom kopieren.Angenommen, der Name MemoryStream lautet
ms
.Dieser Code schreibt MemoryStream in eine Datei:
und dies liest eine Datei in einen MemoryStream:
In .Net Framework 4+ können Sie FileStream einfach in MemoryStream kopieren und so einfach umkehren:
Und die Umkehrung (MemoryStream zu FileStream):
quelle
ms.ToArray()
Funktion verwenden.using (...){ }
hat genau den gleichen Effekt.Der Stream sollte wirklich entsorgt werden, auch wenn es eine Ausnahme gibt (sehr wahrscheinlich bei Datei-E / A). Die Verwendung von Klauseln ist mein bevorzugter Ansatz, sodass Sie zum Schreiben Ihres MemoryStream Folgendes verwenden können:
Und zum Zurücklesen:
Wenn die Dateien groß sind, ist zu beachten, dass der Lesevorgang doppelt so viel Speicher benötigt wie die gesamte Dateigröße . Eine Lösung hierfür besteht darin, den MemoryStream aus dem Byte-Array zu erstellen. Im folgenden Code wird davon ausgegangen, dass Sie dann nicht in diesen Stream schreiben.
Meine Forschung (unten) zeigt, dass der interne Puffer das gleiche Byte-Array ist, mit dem Sie ihn übergeben, sodass Speicherplatz gespart werden sollte.
quelle
Für alle, die nach Kurzversionen suchen:
quelle
Die kombinierte Antwort zum Schreiben in eine Datei kann sein;
quelle
In einer Datei speichern
Laden aus einer Datei
wo
und
quelle
Zum Laden einer Datei gefällt mir das viel besser
quelle
Ich verwende ein Bedienfeld, um ein Bild hinzuzufügen oder sogar Videos zu streamen, aber Sie können das Bild auf SQL Server als Image oder MySQL als Largeblob speichern . Dieser Code funktioniert bei mir sehr. Hör zu.
Hier speichern Sie das Bild
Und hier können Sie laden, aber ich habe ein PictureBox-Steuerelement verwendet.
Hoffnung hilft.
quelle
Verwendung :-
quelle