使用ZipArchive获取带有InvalidDataException的Windows Store应用程序中的.zip文件

时间:2012-12-26 19:13:58

标签: c# windows-8 windows-runtime zipfile

我正在开发一个Windows Store应用程序概念证明,它将打开.zip文件并将内容解压缩到特定于应用程序的漫游文件夹。我已经研究了几个流行的库来提取内容,却发现这些库不支持Windows应用商店应用程序(至少目前还没有)。所以,我决定选择ZipArchive。我在按钮单击处理程序中有以下代码:

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    var fileOpenPicker = new FileOpenPicker();
    fileOpenPicker.FileTypeFilter.Add(".zip");
    var openedFile = await fileOpenPicker.PickSingleFileAsync();

    var booksFolder = await Windows.Storage.ApplicationData.Current.RoamingFolder.CreateFolderAsync("Stuff", CreationCollisionOption.OpenIfExists);
    var folder = await booksFolder.CreateFolderAsync(openedFile.Name.Replace(".zip", string.Empty), CreationCollisionOption.ReplaceExisting);

    using (var stream = await openedFile.OpenStreamForReadAsync())
    {
        using (var zip = new ZipArchive(stream, ZipArchiveMode.Read))
        {
            foreach (var entry in zip.Entries)
            {
                using (var entryStream = entry.Open())
                {
                    var file = await folder.CreateFileAsync(entry.Name);
                    using (var decompressedStream = await file.OpenStreamForWriteAsync())
                    {
                        using (var deflateStream = new DeflateStream(entryStream, CompressionMode.Decompress))
                        {
                            await deflateStream.CopyToAsync(decompressedStream, (int)entry.Length);
                        }
                    }
                }
            }
        }
    }
}

但是,我在行<{1}}

InvalidDataException

以下是例外的详细信息:

await deflateStream.CopyToAsync(decompressedStream, (int)entry.Length);

我尝试导入的.zip文件是使用Windows资源管理器的“发送到压缩(Zipped)文件夹”选项创建的。我还尝试使用ZipArchive在代码中创建一个.zip文件,但我也得到了更多的例外代码。既然这不是我理想的用例,我不会包含我的代码来创建.zip,除非它对某人有用。

我希望有人能够在上面的代码中看到我的方式的错误,或者提供一个实体库的链接来处理优选开源的zip文件。这位沮丧的开发人员非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您不必解压缩entry.Open()的结果。它已经解压缩了。

您还可以使用ZipFileExtensions.ExtractToDirectory(http://msdn.microsoft.com/en-us/library/system.io.compression.zipfileextensions.extracttodirectory.aspx)来简化代码。