简体   繁体   English

如何在包含子文件夹和文件的隔离存储中压缩和解压缩根文件夹

[英]How to zip and unzip root folder in isolated storage containing subfolders and files

I have problems in using SharpZipLib with isolated storage in WP7 to zip subfolders in isolated storage. 我在将SharpZipLib与WP7中的隔离存储一起使用来压缩隔离存储中的子文件夹时遇到问题。 My folder structure is like I'm having a rootFolder in isolated storage and inside that there is subFolder having some text files and more subfolders (contains .jpg and .png). 我的文件夹结构就像我在隔离存储区中有一个rootFolder一样,里面有subFolder ,其中有一些文本文件和更多子文件夹(包含.jpg和.png)。 I could go for Dotnetzip but I'm not sure it is available for WP7 or not and about its usage. 我可以使用Dotnetzip,但不确定它是否可用于WP7及其用途。

  1. I am able to get all the file pathes in a list by recursively traversing on root folder. 我可以通过在根文件夹上递归遍历来获得列表中的所有文件路径。 At present I am able to zip multiple files but only when they are inside a single folder. 目前,我可以压缩多个文件,但仅当它们位于单个文件夹中时才可以。

  2. Can't find way to zip subFolder with correct hierarchy of folder and file structure and save it inside isolated storage. 无法找到正确的文件夹和文件结构层次结构来压缩subFolder并将其保存在隔离存储中的方法。 Also needs to unzip it with correct folder and file structure. 还需要使用正确的文件夹和文件结构将其解压缩。

You can do this with SharpZipLib for Silverlight/Windows Phone 7. 您可以使用适用于Silverlight / Windows Phone 7的SharpZipLib进行此操作。

The following code is based on this example and demonstrates how to zip a root folder including subfolders and files. 以下代码基于该示例,并演示了如何压缩包含子文件夹和文件的根文件夹。

Short overview: 简短概述:

  • button1_Click prepares some dummy folders and files for proof of concept: a folder root containing a file and two subfolders each also containing a file, then it calls CreateZip to compress the whole directory tree starting with root button1_Click准备一些虚拟文件夹和文件以进行概念验证:一个文件夹包含一个文件,两个子文件夹也包含一个文件,然后调用CreateZip压缩以root开头的整个目录树
  • CreateZip prepares the zip file and starts recursive folder compression by calling CompressFolder CreateZip准备zip文件并通过调用CompressFolder开始递归文件夹压缩
  • CompressFolder adds all files in a given dir to the zip file and recurses into subdirectories CompressFolder将给定目录中的所有文件添加到zip文件中,然后递归到子目录中

The code: 编码:

    using System.IO.IsolatedStorage;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Core;
    using System.Text;

    // Recurses down the folder structure
    //
    private void CompressFolder(string path, ZipOutputStream zipStream, int folderOffset, IsolatedStorageFile isf)
    {

        string[] files = isf.GetFileNames(System.IO.Path.Combine(path, "*.*"));

        foreach (string filename in files)
        {
            string filenameWithPath = System.IO.Path.Combine(path, filename);
            string entryName = filenameWithPath.Substring(folderOffset); // Makes the name in zip based on the folder
            entryName = ZipEntry.CleanName(entryName); // Removes drive from name and fixes slash direction
            ZipEntry newEntry = new ZipEntry(entryName);
            newEntry.DateTime = isf.GetLastWriteTime(filenameWithPath).DateTime; // Note the zip format stores 2 second granularity

            // To permit the zip to be unpacked by built-in extractor in WinXP and Server2003, WinZip 8, Java, and other older code,
            // you need to do one of the following: Specify UseZip64.Off, or set the Size.
            // If the file may be bigger than 4GB, or you do not need WinXP built-in compatibility, you do not need either,
            // but the zip will be in Zip64 format which not all utilities can understand.
            //   zipStream.UseZip64 = UseZip64.Off;
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filenameWithPath, System.IO.FileMode.Open, isf))
            {
                newEntry.Size = stream.Length;
            }

            zipStream.PutNextEntry(newEntry);

            // Zip the file in buffered chunks
            // the "using" will close the stream even if an exception occurs
            byte[] buffer = new byte[4096];
            using (IsolatedStorageFileStream streamReader = isf.OpenFile(filenameWithPath, System.IO.FileMode.Open))
            {
                StreamUtils.Copy(streamReader, zipStream, buffer);
            }
            zipStream.CloseEntry();
        }
        string[] folders = isf.GetDirectoryNames(System.IO.Path.Combine(path, "*.*"));
        foreach (string folder in folders)
        {
            CompressFolder(System.IO.Path.Combine(path, folder), zipStream, folderOffset, isf);
        }
    }

    // Compresses the files in the nominated folder, and creates a zip file on disk named as outPathname.
    //
    public void CreateZip(string outPathname, string password, string folderName)
    {

        using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream fsOut = new IsolatedStorageFileStream(outPathname, System.IO.FileMode.Create, isf))
            {
                ZipOutputStream zipStream = new ZipOutputStream(fsOut);

                zipStream.SetLevel(3); //0-9, 9 being the highest level of compression

                zipStream.Password = password;  // optional. Null is the same as not setting.

                // This setting will strip the leading part of the folder path in the entries, to
                // make the entries relative to the starting folder.
                // To include the full path for each entry up to the drive root, assign folderOffset = 0.

                // int folderOffset = folderName.Length + (folderName.EndsWith("\\") ? 0 : 1); // hu: currently not used for WP7 sample
                int folderOffset = 0;

                CompressFolder(folderName, zipStream, folderOffset, isf);

                zipStream.Close();
            }
        }
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
            isf.CreateDirectory(@"root");
            isf.CreateDirectory(@"root\subfolder1");
            isf.CreateDirectory(@"root\subfolder2");

            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(@"root\file0.txt", System.IO.FileMode.Create, isf))
            {
                byte[] bytes = Encoding.Unicode.GetBytes("hello");
                stream.Write(bytes, 0, bytes.Length);
            }

            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(@"root\subfolder1\file1.txt", System.IO.FileMode.Create, isf))
            {
                byte[] bytes = Encoding.Unicode.GetBytes("zip");
                stream.Write(bytes, 0, bytes.Length);
            }

            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(@"root\subfolder2\file2.txt", System.IO.FileMode.Create, isf))
            {
                byte[] bytes = Encoding.Unicode.GetBytes("world");
                stream.Write(bytes, 0, bytes.Length);
            }

        }
        CreateZip("root.zip", null, "root");
    }

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

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