ejemplo crear convert array archivo c# file io stream memorystream

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; }