如何在Windows Phone 8应用程序中解压缩IsolatedStorage中的文件?

在我的应用程序内,我试图一次下载大约180个小音频文件。 我尝试了BackgroundTransferService,但是对于这么多小文件它似乎并不稳定。 所以,现在我正在下载所有这些音频的ZIP,并希望在“audio”文件夹中提取它们。 我尝试了这个线程中的方法:

如何在Windows Phone 8中解压缩文件

但我收到此错误: 'System.IO.IOException' occurred in mscorlib.ni.dll...'System.IO.IOException' occurred in mscorlib.ni.dll...在以下代码中。 我怎样才能克服这个问题?

 while (reader.ReadInt32() != 101010256) { reader.BaseStream.Seek(-5, SeekOrigin.Current); // this line causes error }... 

此外,我在哪里需要放置此代码,我在哪里给它目标目录?

 IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(@"audio.rar", FileMode.Open, FileAccess.ReadWrite)) { UnZipper unzip = new UnZipper(fileStream); foreach (string filename in unzip.FileNamesInZip()) { string FileName = filename; } } 

使用Silverlight SharpZipLib 。 将SharpZipLib.WindowsPhone7.dll添加到您的项目中(也适用于WP8 silverlight)。

  private void Unzip() { using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { ZipEntry entry; int size; byte[] data = new byte[2048]; using (ZipInputStream zip = new ZipInputStream(store.OpenFile("YourZipFile.zip", FileMode.Open))) { // retrieve each file/folder while ((entry = zip.GetNextEntry()) != null) { if (!entry.IsFile) continue; // if file name is music/rock/new.mp3, we need only new.mp3 // also you must make sure file name doesn't have unsupported chars like /,\,etc. int index = entry.Name.LastIndexOf('/'); string name = entry.Name.Substring(index + 1); // create file in isolated storage using (var writer = store.OpenFile(name, FileMode.Create)) { while (true) { size = zip.Read(data, 0, data.Length); if (size > 0) writer.Write(data, 0, size); else break; } } } } } } 

有几个第三方库,以便在WP8中提取ZIP文件,如ZipLib,您可以从@ http://slsharpziplib.codeplex.com/下载,但DotNetZip是一个父ZipLib,更稳定。 这是一个示例代码。 没有检查它是否有效,但这是你如何去做的。

  ZipFile zip = ZipFile.Read(ZipFileToUnzip); foreach (ZipEntry ent in zip) { ent.Extract(DirectoryWhereToUnizp, ExtractExistingFileAction.OverwriteSilently); } 

我刚刚解决了这个问题。 您可以做的是使用此方法,您的文件将保存到zip文件中存在的正确文件夹结构中的独立存储。 您可以根据需要更改要存储数据的位置。

我刚读了一个sample.zip文件。 从您的应用程序文件夹

 private async Task UnZipFile() { var myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication(); using (var fileStream = Application.GetResourceStream(new Uri("sample.zip", UriKind.Relative)).Stream) { var unzip = new UnZipper(fileStream); foreach (string filename in unzip.FileNamesInZip) { if (!string.IsNullOrEmpty(filename)) { if (filename.Any(m => m.Equals('/'))) { myIsolatedStorage.CreateDirectory(filename.Substring(0, filename.LastIndexOfAny(new char[] { '/' }))); } //save file entry to storage using (var streamWriter = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Create, FileAccess.ReadWrite, myIsolatedStorage))) { streamWriter.Write(unzip.GetFileStream(filename)); } } } } } 

欢呼:)