简体   繁体   English

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

[英]How to unzip a file in IsolatedStorage in windows phone 8 app?

Inside my app, I am trying to download about 180 small audio files all at once. 在我的应用程序内,我试图一次下载大约180个小音频文件。 I tried the BackgroundTransferService, but it does not seem stable with so many small files. 我尝试了BackgroundTransferService,但是这么多小文件看起来并不稳定。 So, now I am downloading a ZIP of all those audio and want extract them in "audio" folder. 所以,现在我正在下载所有这些音频的ZIP,并希望在“audio”文件夹中提取它们。 I tried the method in this thread: 我在这个帖子中尝试了这个方法:

How to unzip files in Windows Phone 8 如何在Windows Phone 8中解压缩文件

But I get this error: 'System.IO.IOException' occurred in mscorlib.ni.dll... in the following code. 但我收到此错误: 'System.IO.IOException' occurred in mscorlib.ni.dll...'System.IO.IOException' occurred in mscorlib.ni.dll...在以下代码中。 How can I overcome this issue? 我怎样才能克服这个问题?

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

Also, where do I need to place this code and where do I give it the destination directory? 此外,我在哪里需要放置此代码,我在哪里给它目标目录?

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

Use Silverlight SharpZipLib . 使用Silverlight SharpZipLib Add SharpZipLib.WindowsPhone7.dll to your project (works on WP8 silverlight also). 将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;
                        }
                    }
                }
            }
        }

    }

There are several 3rd party libraries in order to extract ZIP files in WP8 like the ZipLib which you can download from @ http://slsharpziplib.codeplex.com/ however DotNetZip a parent ZipLib and much more stable. 有几个第三方库,以便在WP8中提取ZIP文件,如ZipLib,您可以从@ http://slsharpziplib.codeplex.com/下载,但DotNetZip是一个父ZipLib,更稳定。 Here is a sample code. 这是一个示例代码。 Not checked if it works, but this is how you go at it. 没有检查它是否有效,但这是你如何去做的。

     ZipFile zip = ZipFile.Read(ZipFileToUnzip);

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

I have just solved this. 我刚刚解决了这个问题。 what you can do is use this method and your file will go save to isolated storage in proper folder structure as present in your zip file. 您可以做的是使用此方法,您的文件将保存到zip文件中存在的正确文件夹结构中的独立存储。 you can change according to your need where you want to store the data. 您可以根据需要更改要存储数据的位置。

I have just read a sample.zip file. 我刚刚读了一个sample.zip文件。 From your app folder. 从您的应用程序文件夹

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

cheers :) 欢呼:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM