Saltar al contenido

Guardar y cargar MemoryStream a/desde un archivo

Este grupo de trabajo ha estado largas horas buscando la resolución a tus interrogantes, te compartimos la respuestas así que esperamos servirte de gran ayuda.

Solución:

Puedes utilizar MemoryStream.WriteTo o Stream.CopyTo (compatible con la versión de marco 4.5.2, 4.5.1, 4.5, 4) métodos para escribir el contenido del flujo de memoria en otro flujo.

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 en 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+, simplemente puede 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 al revés (MemoryStream a FileStream):

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write))
    ms.CopyTo(file);

La transmisión realmente debería eliminarse incluso si hay una excepción (muy probablemente en la E/S del archivo); el uso de cláusulas es mi enfoque favorito para esto, por lo que para escribir su MemoryStream, puede usar:

using (FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write)) 
    memoryStream.WriteTo(file);

Y por volver a leerlo:

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 a eso es crear el MemoryStream a partir del byte array – el siguiente código asume 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 el mismo byte array a medida que lo 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());

Tienes la opción de añadir valor a nuestra información tributando tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *