.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 파일로 작업 할 수있는 견고한 라이브러리에 대한 링크를 제공 할 수 있기를 바랍니다. 이 좌절 된 개발자는 모든 도움에 대해 매우 감사하게 생각합니다.
나는 감압하지 않고 시도하고 다른 예외를 받고 있다고 맹세하지만, 나는 그것을하고있는 동안 다른 것을 엉망으로 만들었을 것입니다. 위의 메서드에서 DeflateStream을 가져 와서 매력처럼 작동했습니다. ExtractToDirectory도 멋지지만 ApplicationData.RoamingFolder 및 ApplicationData.LocalFolder와 함께 사용할 수 있습니까? –
이 폴더는 파일 시스템의 어딘가에 위치해야합니다 (Win8에 대한 경험이 없으므로 100 % shure가 아닙니다). 따라서'folder.Path' 만 사용할 수 있습니다. – Peter
의도적으로 WinRT API에서 ExtractToDirectory 확장 메서드를 빠뜨린 것 같습니다 (http://social.msdn.microsoft.com/Forums/en/winappswithcsharp/thread/7906fd37-3918-46c0-b698-920fa2cf0835) . 이 스레드는 1 년 넘었지만 Object Browser에서도 볼 수 없습니다. 파머. 어느 쪽이든, 당신은 내 문제를 해결했습니다. 감사! :) –