Estoy tratando de crear un archivo ZIP con un archivo de texto de demostración simple usando el MemoryStream
siguiente:
using (var memoryStream = new MemoryStream())
using (var archive = new ZipArchive(memoryStream , ZipArchiveMode.Create))
{
var demoFile = archive.CreateEntry("foo.txt");
using (var entryStream = demoFile.Open())
using (var streamWriter = new StreamWriter(entryStream))
{
streamWriter.Write("Bar!");
}
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
{
stream.CopyTo(fileStream);
}
}
Si ejecuto este código, se crea el archivo de almacenamiento en sí, pero foo.txt no.
Sin embargo, si reemplazo el MemoryStream
archivo directamente con la secuencia del archivo, el archivo se crea correctamente:
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
using (var archive = new ZipArchive(fileStream, FileMode.Create))
{
// ...
}
¿Es posible usar un MemoryStream
para crear el archivo ZIP sin el FileStream
?
c#
.net
zip
compression
ziparchive
Marius Schulz
fuente
fuente
using
porentry.Open
, solo una suposición.Respuestas:
Gracias a https://stackoverflow.com/a/12350106/222748 obtuve:
Por lo tanto, debemos llamar a dispose en ZipArchive antes de poder usarlo, lo que significa pasar 'true' como el tercer parámetro a ZipArchive para que podamos acceder a la secuencia después de desecharlo.
fuente
Solo otra versión de compresión sin escribir ningún archivo.
fuente
Establezca la posición de la secuencia en 0 antes de copiarla en la secuencia zip.
fuente
Solución de trabajo para MVC
fuente
Controller.File
método tiene una sobrecarga que aceptaStream
. Úselo para evitar crear otra copia de un archivo ZIP en la memoria.Debe terminar de escribir el flujo de memoria y luego volver a leer el búfer.
fuente
fuente
Esta es la forma de convertir una entidad en un archivo XML y luego comprimirla:
}
fuente
Función para devolver la secuencia que contiene el archivo zip
Si lo desea, escriba zip en la secuencia de archivos.
``
fuente
byteArray
y una vez en elZipArchive
. Sin mencionar que no necesita cargar archivos en la memoria en absoluto. Utilice la transmisión, como se muestra en todas las otras respuestas existentes.fuente