decompress a ZIP file on windows 8 C#

c#, compression, windows-8

Solution

In Metro style apps, you work with compressed files by using the methods in the ZipArchive, ZipArchiveEntry, DeflateStream, and GZipStream classes.

Refer : UnZip File in Metro

Refer : Folder zip/unzip in metro c#

Problem

I am building a metro style app for windows 8 and I have a zip file that I am downloading from a web service, and I want to extract it. I have seen the sample for compression and decompression, but that takes a single file an compresses/decompresses it. I have a whole directory structure that I need to extract. Here is what I have so far: ``` 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); } ``` But this is no good, the `bytesDecompressed` variable is always zero size, but the zip File is 1.2MB Any help here would be greatly appreciated. EDIT: Answer, thanks to `Mahantesh` Here is the code for unzipping a file: ``` 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(); } } } } } } } } ```

Original source