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.