【问题标题】:How to zip and unzip root folder in isolated storage containing subfolders and files如何在包含子文件夹和文件的隔离存储中压缩和解压缩根文件夹
【发布时间】:2011-12-16 16:43:47
【问题描述】:

我在将 SharpZipLib 与 WP7 中的隔离存储一起使用以压缩隔离存储中的子文件夹时遇到问题。我的文件夹结构就像我在独立存储中有一个 rootFolder 并且里面有 subFolder 有一些文本文件和更多子文件夹(包含 .jpg 和 .png)。我可以选择 Dotnetzip,但我不确定它是否适用于 WP7 以及它的用法。

  1. 我可以通过递归遍历根文件夹来获取列表中的所有文件路径。目前我可以压缩多个文件,但只有当它们位于单个文件夹中时。

  2. 无法找到压缩具有正确文件夹层次结构和文件结构的子文件夹并将其保存在隔离存储中的方法。还需要用正确的文件夹和文件结构解压。

【问题讨论】:

    标签: c# .net windows-phone-7 zip windows-phone-7.1


    【解决方案1】:

    对于 Silverlight/Windows Phone 7,您可以使用 SharpZipLib 执行此操作。

    以下代码基于this example,演示如何压缩包含子文件夹和文件的根文件夹。

    简要概述:

    • button1_Click 为概念验证准备了一些虚拟文件夹和文件:一个文件夹 root 包含一个文件和两个 子文件夹 每个也包含一个文件,然后它调用 CreateZip 来压缩以 root 开头的整个目录树
    • CreateZip 准备 zip 文件并通过调用 CompressFolder 开始递归文件夹压缩
    • CompressFolder 将给定目录中的所有文件添加到 zip 文件并递归到子目录中

    代码:

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

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多