c# - SevenZipSharp - 如何使用 C# 将多个目录压缩到一个文件中?

标签 c# winforms compression 7zip sevenzipsharp

我想使用 SevenZipCompressor 将 3 个文件夹压缩到一个文件中。 我知道如何压缩单个文件夹。 这样的事情可能吗??

谢谢!

最佳答案

SevenZipCompressor类提供了一个名为 CompressFileDictionary() 的方法. 其中一个方法重载需要一个文件字典和一个文件流。 文件字典是一个普通的.Net Dictionary<string,string> . 字典的键是文件名(或相对路径) 存档,字典的值是文件在文件系统中的路径。

字典的键允许您控制 7z 存档中的结构。 比如你要压缩三个文件夹

c:\temp\testdir1
             |- file1.txt
             |- file2.txt
c:\temp\testdir2
             |- file1.txt
c:\temp2\test
             |- file3.txt

存档中的结果结构应该是

testdir1
       |- file1.txt
       |- file2.txt
testdir2
       |- file1.txt
    test
       |-file3.txt

然后只需按以下方式将文件添加到字典中:

Dictionary<string, string> filesDic = new Dictionary<string, string>();

filesDic.Add(@"testdir1\file1.txt", @"c:\temp\testdir1\files1.txt");
filesDic.Add(@"testdir1\file2.txt", @"c:\temp\testdir1\files2.txt");
filesDic.Add(@"testdir2\file1.txt", @"c:\temp\testdir2\files1.txt");
filesDic.Add(@"test\file3.txt", @"c:\temp2\test\files3.txt");

下面的例子只是展示了如何自动化创建过程 这样的文件夹字典并将其压缩到单个 7z 存档文件中。

private static void AddFilesFromDirectoryToDictionary(Dictionary<string, string> filesDictionary,
  string pathToDirectory)
{      
  DirectoryInfo dirInfo = new DirectoryInfo(pathToDirectory);      

  FileInfo[] fileInfos = dirInfo.GetFiles("*.*", SearchOption.AllDirectories);

  foreach (FileInfo fi in fileInfos)
  {        
    filesDictionary.Add(fi.FullName.Replace(dirInfo.Parent.FullName + "\\", "").ToLower(),
      fi.FullName);
  }        
}

static void Main(string[] args)
{
  // Set path to 7z library.
  SevenZipCompressor.SetLibraryPath("7z.dll");

  using (FileStream fs = new FileStream("c:\\temp\\test.7z", FileMode.Create))
  {        
    SevenZipCompressor szc = new SevenZipCompressor
                                 {
                                   CompressionMethod = CompressionMethod.Lzma,
                                   CompressionLevel = CompressionLevel.Normal,
                                   CompressionMode = CompressionMode.Create,                                      
                                   DirectoryStructure = true,
                                   PreserveDirectoryRoot = false,
                                   ArchiveFormat = OutArchiveFormat.SevenZip
                                 };        

    Dictionary<string, string> filesDictionary = new Dictionary<string, string>();

    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir1");
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir2");
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp2\test");

    szc.CompressFileDictionary(filesDictionary, fs);                               
  }      
}

您还可以使用以下代码更改创建一个ZIP 存档:

using (FileStream fs = new FileStream("c:\\temp\\test.zip", FileMode.Create))
{        
  SevenZipCompressor szc = new SevenZipCompressor
          {
            CompressionMethod = CompressionMethod.Deflate,
            CompressionLevel = CompressionLevel.Normal,
            CompressionMode = CompressionMode.Create,                                      
            DirectoryStructure = true,
            PreserveDirectoryRoot = false,
            ArchiveFormat = OutArchiveFormat.Zip
          };        

   Dictionary<string, string> filesDictionary = new Dictionary<string, string>();

   AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir1");
   AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir2");
   AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp2\test");

   szc.CompressFileDictionary(filesDictionary, fs);                               
 }

关于c# - SevenZipSharp - 如何使用 C# 将多个目录压缩到一个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18154333/

相关文章:

c# - 如何使用 HTTPclient 内容类型进行 POST = application/x-www-form-urlencoded

具有 "complex"参数的函数的 C# 单元测试结构

c# - 实现 IEnumerable<T> 的自定义集合的 Json.net 序列化

c# - 如何获得每个国家与谷歌的距离

image-processing - 用于创建 PNG 8 位透明图像的软件

java - 如何压缩 float 据?

c# - 在c#中解析嵌套列表数据

c# - Windows 窗体中 GridView 内的 Treeview

c# - NPoco InsertBulk() 花了 45 *分钟* 插入 20,000 条记录

compression - 如何在 Squeak Smalltalk 中压缩目录?