decompress a ZIP file on windows 8 C#

别说谁变了你拦得住时间么 提交于 2019-12-04 23:28:49
Mahantesh

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#

Based on your code and suggestions, I came up with one which supports folders extraction, which was one of my needs:

private async void UnZipFile(string file)
{
    var folder = ApplicationData.Current.LocalFolder;

    using (var zipStream = await folder.OpenStreamForReadAsync(file))
    {
        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 == "")
                    {
                        // Folder
                        await CreateRecursiveFolder(folder, entry);
                    }
                    else
                    {
                        // File
                        await ExtractFile(folder, entry);
                    }
                }
            }
        }
    }
}

private async Task CreateRecursiveFolder(StorageFolder folder, ZipArchiveEntry entry)
{
    var steps = entry.FullName.Split('/').ToList();

    steps.RemoveAt(steps.Count() - 1);

    foreach (var i in steps)
    {
        await folder.CreateFolderAsync(i, CreationCollisionOption.OpenIfExists);

        folder = await folder.GetFolderAsync(i);
    }
}

private async Task ExtractFile(StorageFolder folder, ZipArchiveEntry entry)
{
    var steps = entry.FullName.Split('/').ToList();

    steps.RemoveAt(steps.Count() - 1);

    foreach (var i in steps)
    {
        folder = await folder.GetFolderAsync(i);
    }

    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();
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!