SevenZipSharp - как сжать несколько каталогов в один файл с помощью С#?

Я хочу сжать 3 папки в один файл с помощью SevenZipCompressor. Я знаю, как сжать одну папку. Такое возможно??

Благодарю вас !


person subirshan    schedule 09.08.2013    source источник


Ответы (1)


Класс 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);                               
 }
person Hans    schedule 10.08.2013
comment
@subirshan: Помогает ли мой ответ? - person Hans; 12.09.2013
comment
Кажется, это работает только для файлов .7z, а не для файлов .zip? это правильно? - person Mark Redman; 12.05.2014
comment
@MarkRedman: Вы также можете создать архив .zip. Я обновил свой ответ, чтобы показать, как создать архив .zip. Я также исправил небольшую ошибку в функции AddFilesFromDirectoryToDictionary(). - person Hans; 12.05.2014
comment
Ваш ответ правильный. Однако при этом не сохраняется дата модификации каждого файла. делая каждый файл таким, как будто он был создан только что. Это еще большая проблема сейчас. - person subirshan; 02.12.2017