2015-01-19 2 views
0

У меня есть 2 zip-файла (zip1 и zip2), мне нужно объединить эти файлы в одном, как я могу его решить? Я понимаю, что могу исправить это, распакуя ZIP1 в временную папку, а затем добавить его в zip2, но я думаю, что это неэффективно, что такое более быстрый метод?Как слить 2 ZIP-файла в 1?

Я использую библиотеку System.IO.Compression ...

Я использую этот код для изучения Zip2:

using (ZipArchive archive = ZipFile.OpenRead(Zip2)) 
{ 
    foreach (ZipArchiveEntry entry in archive.Entries) 
    { 
     /*...*/ 
    } 
} 

PD /: Файлы Zip1 и Zip2 имеют файлы, папки и подпапки

+0

Какого размера архивных файлов мы говорим? Несколько МБ? Несколько ГБ? –

ответ

1

Я не проверял это, но вы можете дать ему возможность:

public ZipArchive Merge(List<ZipArchive> archives) 
    { 
     if (archives == null) throw new ArgumentNullException("archives"); 
     if (archives.Count == 1) return archives.Single(); 

     using (var memoryStream = new MemoryStream()) 
     { 
      using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
      { 
       foreach (var zipArchive in archives) 
       { 
        foreach (var zipArchiveEntry in zipArchive.Entries) 
        { 
         var file = archive.CreateEntry(zipArchiveEntry.FullName); 

         using (var entryStream = file.Open()) { 
          using (var streamWriter = new StreamWriter(entryStream)) { streamWriter.Write(zipArchiveEntry.Open()); } 
         } 
        } 
       } 

       return archive; 
      } 
     } 
    } 
+0

Привет, спасибо за ваш ответ, но сначала вам нужно прочитать поток 'zipArchiveEntry.Open()', чтобы записать его в 'StreamWriter', я его разрешаю с помощью' StreamReader' – Manux22

+0

Ах, и вам нужно вернуть поток, а не ZipArchive .. , – Manux22

0

Этого пример показывает, как объединить два почтовых индекс файлов в третий в памяти или с реальными файлами с помощью библиотеки DotNetZip:

//file1 and file2 are MemoryStream or file names 
//for performance reason it is better that file1 is less than file2 

//file1.Position = 0;//ensure at case of MemoryStream 
using (var zip1 = ZipFile.Read(file1)) 
{ 
    //file2.Position = 0;//ensure at case of MemoryStream 
    using (var zip2 = ZipFile.Read(file2)) 
    { 
     var zip2EntryNames = zip2.Entries.Select(y => y.FileName).ToList(); 
     foreach (var entry in zip1.Entries.Where(x => !zip2EntryNames.Contains(x.FileName)).ToList()) 
     { 
      var memoryStream = new MemoryStream(); 
      entry.Extract(memoryStream); 
      memoryStream.Position = 0; 
      zip2.AddEntry(entry.FileName, memoryStream); 
     } 
     if(save2file) 
      zip2.Save(fileNameResult); 
     else 
      using (var result = new MemoryStream()) 
      { 
       zip2.Save(result);       
      } 
    } 
} 
Смежные вопросы