2016-05-07 3 views
4

Я пытаюсь сжать два текстовых файла в zip-файл. Это как мой публичный метод выглядит следующим образом:Как сжать несколько файлов в zip-файле

public ActionResult Index() 
{ 

    byte[] file1 = System.IO.File.ReadAllBytes(@"C:\file1.txt"); 
    byte[] file2 = System.IO.File.ReadAllBytes(@"C:\file2.txt"); 
    Dictionary<string, byte[]> fileList = new Dictionary<string, byte[]>(); 
    fileList.Add("file1.txt", file1); 
    fileList.Add("file2.txt", file2); 
    CompressToZip("zip.zip", fileList); 

    return View(); 
} 

Это как мой метод сжатия выглядит следующим образом:

private void CompressToZip(string fileName, Dictionary<string, byte[]> fileList) 
{ 
    using (var memoryStream = new MemoryStream()) 
    { 
     foreach (var file in fileList) 
     { 
      using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
      { 
       var demoFile = archive.CreateEntry(file.Key); 

       using (var entryStream = demoFile.Open()) 
       using (var b = new BinaryWriter(entryStream)) 
       { 
        b.Write(file.Value); 
       } 
      } 
     } 

     using (var fileStream = new FileStream(fileName, FileMode.Create)) 
     { 
      memoryStream.Seek(0, SeekOrigin.Begin); 
      memoryStream.CopyTo(fileStream); 
     } 
    } 

} 

При таком подходе, папка на молнии отлично создан. Однако проблема в том, что я получаю только один файл внутри zip-папки (только второй файл будет создан внутри папки zip). Ошибок не найдено.

Вопрос: Как сжать оба текстовых файла в папку zip?

Благодарим вас за продвинутый!

ответ

7

Ваш код фактически сохраняет два отдельных zip-архива в файл zip.zip (для каждого файла, который должен быть сжат, создается новый ZipArchive). Первый zip-архив содержит только file1.txt, второй только file2.txt. Когда вы открываете zip.zip в Проводнике Windows, он показывает только содержимое второго zip-архива.

Чтобы создать единый архив почтового индекса, содержащий оба файла, просто переместить создание ZipArchive вне вашего fileList цикла:

using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
{ 
    foreach (var file in fileList) 
    {      
     var demoFile = archive.CreateEntry(file.Key); 

     using (var entryStream = demoFile.Open()) 
     using (var b = new BinaryWriter(entryStream)) 
     { 
      b.Write(file.Value); 
     } 
    } 
} 
+0

он работал отлично. Большое спасибо! – Dayan

4

На первый взгляд, я хотел бы предложить, что ваше foreach заявление вокруг using var (archive = new ZipArchive...) является неправильный путь.

Таким образом, вы создаете новый ZipArchive каждый раз, когда вы повторяете цикл foreach.

Конечно, вы хотите создать ZipArchive и петлю через foreachвнутри того?

Как это:

private void CompressToZip(string fileName, Dictionary<string, byte[]> fileList) 
{ 
    using (var memoryStream = new MemoryStream()) 
    { 
     using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
     { 
      foreach (var file in fileList) 
      { 
       var demoFile = archive.CreateEntry(file.Key); 

       using (var entryStream = demoFile.Open()) 
       using (var b = new BinaryWriter(entryStream)) 
       { 
        b.Write(file.Value); 
       } 
      } 
     } 

     using (var fileStream = new FileStream(fileName, FileMode.Create)) 
     { 
      memoryStream.Seek(0, SeekOrigin.Begin); 
      memoryStream.CopyTo(fileStream); 
     } 
    } 
} 

Надеется, что это помогает!

+0

Благодарим вас за помощь! – Dayan