2012-12-26 4 views
1

.zip 파일을 열고 해당 앱의 로밍 폴더로 내용을 추출하는 개념의 Windows 스토어 앱을 개발 중입니다. 몇 가지 인기있는 라이브러리를 조사하여 내용을 추출하여이 라이브러리가 Windows Store 앱을 지원하지 않는다는 사실을 발견했습니다 (최소한 아직까지는). 그래서 나는 ZipArchive와 함께 가기로 결정했습니다. 나는 버튼 클릭 처리기에서 다음 코드를 :Windows 스토어에서 ZipArchive로 .zip 파일을 추출하는 중

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); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

는 그러나, 나는 선

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

상의 InvalidDataException를 얻을 여기에 예외의 세부 사항입니다 :

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 탐색기의 압축 (압축) 폴더로 보내기 옵션으로 생성되었습니다. 또한 ZipArchive를 사용하여 코드에서 .zip 파일을 만들려고 시도했지만 그 코드도 함께 예외가 더 많이 발생합니다. 어쨌든 그건 이상적인 유스 케이스가 아니기 때문에 누군가에게 유용하지 않다면 .zip을 만드는 코드를 포함하지 않을 것입니다.

누군가 위의 코드에서 내 방식의 오류를 보거나 선호되는 오픈 소스 인 zip 파일로 작업 할 수있는 견고한 라이브러리에 대한 링크를 제공 할 수 있기를 바랍니다. 이 좌절 된 개발자는 모든 도움에 대해 매우 감사하게 생각합니다.

답변

0

entry.Open()의 결과를 압축 해제 할 필요가 없습니다. 그것은 이미 압축 해제되었습니다.

코드를 단순화하기 위해 ZipFileExtensions.ExtractToDirectory (http://msdn.microsoft.com/en-us/library/system.io.compression.zipfileextensions.extracttodirectory.aspx)을 사용할 수도 있습니다.

+0

나는 감압하지 않고 시도하고 다른 예외를 받고 있다고 맹세하지만, 나는 그것을하고있는 동안 다른 것을 엉망으로 만들었을 것입니다. 위의 메서드에서 DeflateStream을 가져 와서 매력처럼 작동했습니다. ExtractToDirectory도 멋지지만 ApplicationData.RoamingFolder 및 ApplicationData.LocalFolder와 함께 사용할 수 있습니까? –

+0

이 폴더는 파일 시스템의 어딘가에 위치해야합니다 (Win8에 대한 경험이 없으므로 100 % shure가 아닙니다). 따라서'folder.Path' 만 사용할 수 있습니다. – Peter

+0

의도적으로 WinRT API에서 ExtractToDirectory 확장 메서드를 빠뜨린 것 같습니다 (http://social.msdn.microsoft.com/Forums/en/winappswithcsharp/thread/7906fd37-3918-46c0-b698-920fa2cf0835) . 이 스레드는 1 년 넘었지만 Object Browser에서도 볼 수 없습니다. 파머. 어느 쪽이든, 당신은 내 문제를 해결했습니다. 감사! :) –

관련 문제