c# - crear - Guardar y cargar MemoryStream en/desde un archivo
memorystream to stream c# (8)
Estoy serializando una estructura en un MemoryStream
y quiero guardar y cargar la estructura serializada.
Entonces, ¿Cómo guardar un MemoryStream
en un archivo y también volver a cargarlo desde un archivo?
El flujo debería eliminarse incluso si hay una excepción (muy probablemente en la E / S de archivos). Las cláusulas de uso son mi método favorito para esto, así que para escribir su MemoryStream, puede usar:
using (FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write)) {
memoryStream.WriteTo(file);
}
Y para leerlo de nuevo:
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read)) {
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
ms.Write(bytes, 0, (int)file.Length);
}
Si los archivos son grandes, vale la pena señalar que la operación de lectura utilizará el doble de memoria que el tamaño total del archivo . Una solución para eso es crear el MemoryStream desde la matriz de bytes: el siguiente código supone que no escribirá en esa secuencia.
MemoryStream ms = new MemoryStream(bytes, writable: false);
Mi investigación (a continuación) muestra que el búfer interno es la misma matriz de bytes que se pasa, por lo que debería ahorrar memoria.
byte[] testData = new byte[] { 104, 105, 121, 97 };
var ms = new MemoryStream(testData, 0, 4, false, true);
Assert.AreSame(testData, ms.GetBuffer());
La respuesta combinada para escribir en un archivo puede ser;
MemoryStream ms = new MemoryStream();
FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write);
ms.WriteTo(file);
file.Close();
ms.Close();
Para cargar un archivo, esto me gusta mucho mejor.
MemoryStream ms = new MemoryStream();
using (FileStream fs = File.OpenRead(file))
{
fs.CopyTo(ms);
}
Para quien busca las versiones cortas:
var memoryStream = new MemoryStream(File.ReadAllBytes("1.dat"));
File.WriteAllBytes("1.dat", memoryStream.ToArray());
Puede usar los Stream.CopyTo
MemoryStream.WriteTo
o Stream.CopyTo
(admitido en framework versión 4.5.2, 4.5.1, 4.5, 4) para escribir el contenido de la secuencia de memoria en otra secuencia.
memoryStream.WriteTo(fileStream);
Actualizar:
fileStream.CopyTo(memoryStream);
memoryStream.CopyTo(fileStream);
Suponiendo que el nombre de MemoryStream es ms
.
Este código escribe MemoryStream en un archivo:
using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {
byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, (int)ms.Length);
file.Write(bytes, 0, bytes.Length);
ms.Close();
}
y esto lee un archivo a un MemoryStream:
using (MemoryStream ms = new MemoryStream())
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read)) {
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
ms.Write(bytes, 0, (int)file.Length);
}
En .Net Framework 4+, puedes simplemente copiar FileStream a MemoryStream y revertir tan simple como esto:
MemoryStream ms = new MemoryStream();
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read))
file.CopyTo(ms);
Y el reverso (MemoryStream a FileStream):
using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write))
ms.CopyTo(file);
Utilizo un control de panel para agregar una imagen o incluso transmitir video, pero puede guardar la imagen en SQL Server como imagen o MySQL como bigblob . Este código me funciona mucho. Echale un vistazo.
Aquí guardas la imagen.
MemoryStream ms = new MemoryStream();
Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
panel1.DrawToBitmap(bmp, panel1.Bounds);
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // here you can change the Image format
byte[] Pic_arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(Pic_arr, 0, Pic_arr.Length);
ms.Close();
Y aquí puedes cargar, pero usé un control PictureBox.
MemoryStream ms = new MemoryStream(picarr);
ms.Seek(0, SeekOrigin.Begin);
fotos.pictureBox1.Image = System.Drawing.Image.FromStream(ms);
La esperanza ayuda.
Guardar en un archivo
Car car = new Car();
car.Name = "Some fancy car";
MemoryStream stream = Serializer.SerializeToStream(car);
System.IO.File.WriteAllBytes(fileName, stream.ToArray());
Cargar desde un archivo
using (var stream = new MemoryStream(System.IO.File.ReadAllBytes(fileName)))
{
Car car = (Car)Serializer.DeserializeFromStream(stream);
}
dónde
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace Serialization
{
public class Serializer
{
public static MemoryStream SerializeToStream(object o)
{
MemoryStream stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, o);
return stream;
}
public static object DeserializeFromStream(MemoryStream stream)
{
IFormatter formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
object o = formatter.Deserialize(stream);
return o;
}
}
}
Originalmente la implementación de esta clase ha sido publicada here
y
[Serializable]
public class Car
{
public string Name;
}