Estoy construyendo una aplicación de estilo metro para Windows 8 y tengo un archivo zip que estoy descargando desde un servicio web, y quiero extraerlo.descomprimir un archivo ZIP en Windows 8 C#
He visto la muestra para compresión y descompresión, pero eso toma un solo archivo y lo comprime/descomprime. Tengo toda una estructura de directorios que necesito extraer.
Esto es lo que tengo hasta ahora:
var appData = ApplicationData.Current;
var file = await appData.LocalFolder.GetItemAsync("thezip.zip") as StorageFile;
var decompressedFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("tempFileName", CreationCollisionOption.GenerateUniqueName);
using (var decompressor = new Decompressor(await file.OpenSequentialReadAsync()))
using (var decompressedOutput = await decompressedFile.OpenAsync(FileAccessMode.ReadWrite))
{
var bytesDecompressed = await RandomAccessStream.CopyAsync(decompressor, decompressedOutput);
}
Pero esto no es bueno, la variable es siempre bytesDecompressed
tamaño cero, pero el archivo zip es 1,2 MB
Cualquier ayuda aquí sería enormemente apreciado.
EDIT: respuesta, gracias a Mahantesh
Aquí está el código para descomprimir un archivo:
private async void UnZipFile()
{
var folder = ApplicationData.Current.LocalFolder;
using (var zipStream = await folder.OpenStreamForReadAsync("thezip.zip"))
{
using (MemoryStream zipMemoryStream = new MemoryStream((int)zipStream.Length))
{
await zipStream.CopyToAsync(zipMemoryStream);
using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Read))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (entry.Name != "")
{
using (Stream fileData = entry.Open())
{
StorageFile outputFile = await folder.CreateFileAsync(entry.Name, CreationCollisionOption.ReplaceExisting);
using (Stream outputFileStream = await outputFile.OpenStreamForWriteAsync())
{
await fileData.CopyToAsync(outputFileStream);
await outputFileStream.FlushAsync();
}
}
}
}
}
}
}
}
I' he implementado este código para descomprimir un archivo zip presente en mi carpeta ApplicationData.Current.LocalFolder. Pero el archivo zip contiene carpetas y subcarpetas. Entonces, el código, cuando se ejecuta, da "Error de acceso denegado" mientras se realiza la operación aguardar outputFile.OpenStreamForWriteAsync() en estas subcarpetas. Sin embargo, el error se vio en cualquier subcarpeta aleatoria cuando el código se ejecutó varias veces. ¿Alguna idea sobre esto? –
Ok ... el error fue que había hecho el método UnZipFile como un método estático que no debería haber hecho ... –