1

私は、.zip ファイルを開き、コンテンツをアプリ固有のローミング フォルダーに抽出する Windows ストア アプリの概念実証に取り組んでいます。いくつかの一般的なライブラリを調べてコンテンツを抽出しましたが、これらのライブラリは 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);
                        }
                    }
                }
            }
        }
    }
}

しかし、私InvalidDataExceptionはオンラインになります

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

例外の詳細は次のとおりです。

System.IO.InvalidDataException was unhandled by user code
  HResult=-2146233087
  Message=Unknown block type. Stream might be corrupted.
  Source=System
  StackTrace:
       at System.IO.Compression.DeflateStream.EndRead(IAsyncResult asyncResult)
       at System.IO.Stream.<BeginEndReadAsync>b__e(Stream stream, IAsyncResult asyncResult)
       at System.Threading.Tasks.TaskFactory`1.FromAsyncTrimPromise`1.Complete(TInstance thisRef, Func`3 endMethod, IAsyncResult asyncResult, Boolean requiresSynchronization)
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.IO.Stream.<CopyToAsyncInternal>d__2.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
       at POC.MoviePlayer.GroupedItemsPage.<Button_Click_1>d__4.MoveNext() in c:\Users\Brent\Documents\Visual Studio 2012\Projects\POC.MoviePlayer\POC.MoviePlayer\GroupedItemsPage.xaml.cs:line 108
  InnerException: 

インポートしようとしている .zip ファイルは、Windows エクスプローラーの [圧縮 (Zip 形式) フォルダーに送信] オプションを使用して作成されたものです。また、ZipArchive を使用してコードで .zip ファイルを作成しようとしましたが、そのコードでもさらに多くの例外が発生します。いずれにせよ、それは私の理想的な使用例ではないので、.zip を作成するためのコードは、誰かにとって有用であることが判明しない限り含めません。

誰かが上記のコードで私の方法のエラーを確認するか、できればオープンソースである zip ファイルを操作するための堅実なライブラリへのリンクを提供してくれることを願っています。この欲求不満の開発者は、どんな助けにも非常に感謝しています.

4

1 に答える 1