net ejemplos descomprimir crear archivo c# .net windows-8 ziparchive

c# - ejemplos - ZipArchive crea un archivo ZIP no válido



zip file vb net (5)

El código completo se ve así:

var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip",CreationCollisionOption.ReplaceExisting); using (Stream zipStream = await zipFile.OpenStreamForWriteAsync()) { using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { var entry = zip.CreateEntry("test.txt"); using (StreamWriter sw = new StreamWriter(entry.Open())) { sw.WriteLine("Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula."); } } }

Intento crear un nuevo paquete ZIP a partir del código con una entrada y guardar el paquete ZIP en un archivo. Estoy tratando de lograr esto con la clase System.IO.Compression.ZipArchive . Estoy creando el paquete ZIP con el siguiente código:

using (MemoryStream zipStream = new MemoryStream()) { using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create)) { var entry = zip.CreateEntry("test.txt"); using (StreamWriter sw = new StreamWriter(entry.Open())) { sw.WriteLine( "Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula."); }

Luego guardo el archivo ZIP en un archivo, ya sea en WinRT:

var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip", CreationCollisionOption.ReplaceExisting); zipStream.Position = 0; using (Stream s = await file.OpenStreamForWriteAsync()) { zipStream.CopyTo(s); }

O en .NET 4.5 normal:

using (FileStream fs = new FileStream(@"C:/Temp/test.zip", FileMode.Create)) { zipStream.Position = 0; zipStream.CopyTo(fs); }

Sin embargo, no puedo abrir los archivos producidos ni en Windows Explorer, WinRAR, etc. (Verifiqué que el tamaño del archivo producido coincide con la longitud del zipStream, por lo que la secuencia se guardó correctamente en el archivo).
¿Estoy haciendo algo mal o hay un problema con la clase ZipArchive?


En todo su Stream Object debe rebobinar las secuencias desde el principio para que otras aplicaciones las lean correctamente utilizando el método .Seek.

Ejemplo:

zipStream.Seek(0, SeekOrigin.Begin);


Encontré el error, en retrospectiva, obvio, en mi código. El ZipArchive tiene que estar dispuesto a hacerlo escribir su contenido a su flujo subyacente. Así que tuve que guardar la secuencia en un archivo después del final del bloque de uso de ZipArchive.
Y era importante establecer el argumento leaveOpen de su constructor en true, para que no cierre la secuencia subyacente. Así que aquí está la solución de trabajo completa:

using (MemoryStream zipStream = new MemoryStream()) { using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { var entry = zip.CreateEntry("test.txt"); using (StreamWriter sw = new StreamWriter(entry.Open())) { sw.WriteLine( "Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula."); } } var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync( "test.zip", CreationCollisionOption.ReplaceExisting); zipStream.Position = 0; using (Stream s = await file.OpenStreamForWriteAsync()) { zipStream.CopyTo(s); } }


Puede seguir la misma idea, solo en orden inverso, usando el flujo de archivos como fuente. Hice el siguiente formulario y el archivo se abrió normalmente:

string fileFormat = ".zip"; // any format string filename = "teste" + fileformat; StorageFile zipFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename,CreationCollisionOption.ReplaceExisting); using (Stream zipStream = await zipFile.OpenStreamForWriteAsync()){ using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create)){ //Include your content here } }


// Create file "archive.zip" in current directory use it as destination for ZIP archive using (var zipArchive = new ZipArchive(File.OpenWrite("archive.zip"), ZipArchiveMode.Create)) { // Create entry inside ZIP archive with name "test.txt" using (var entry = zipArchive.CreateEntry("test.txt").Open()) { // Copy content from current directory file "test.txt" into created ZIP entry using (var file = File.OpenRead("test.txt")) { file.CopyTo(entry); } } }

En el resultado obtendrá el archivo "archive.zip" con el archivo de entrada simple "test.txt". Necesita esta cascada de using para evitar cualquier interacción con los recursos ya dispuestos.