How to unzip a file in IsolatedStorage in windows

2019-06-25 09:28发布

问题:

Inside my app, I am trying to download about 180 small audio files all at once. I tried the BackgroundTransferService, but it does not seem stable with so many small files. So, now I am downloading a ZIP of all those audio and want extract them in "audio" folder. I tried the method in this thread:

How to unzip files in Windows Phone 8

But I get this error: 'System.IO.IOException' occurred in mscorlib.ni.dll... in the following code. 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;
    }
}

回答1:

Use Silverlight SharpZipLib. Add SharpZipLib.WindowsPhone7.dll to your project (works on WP8 silverlight also).

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

    }


回答2:

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


回答3:

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. you can change according to your need where you want to store the data.

I have just read a sample.zip file. 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 :)