2014-11-24 6 views
6

Ich versuche, ein ZIP-Archiv mit mehreren Textdateien zu erstellen, wie folgt:C# erstellen ZIP-Archiv mit mehreren Dateien

Dictionary<string, string> Values = new Dictionary<string, string>(); 
using (var memoryStream = new MemoryStream()) 
{ 
    string zip = @"C:\Temp\ZipFile.zip"; 
    foreach (var item in Values) 
    { 
     using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
     { 
      var file = archive.CreateEntry(item.Key + ".txt"); 
      using (var entryStream = file.Open()) 
      using (var streamWriter = new StreamWriter(entryStream)) 
      { 
       streamWriter.Write(item.Value); 
      } 
     } 
    } 
    using (var fileStream = new FileStream(zip, FileMode.Create)) 
    { 
     memoryStream.Seek(0, SeekOrigin.Begin); 
     memoryStream.CopyTo(fileStream); 
    } 
} 

jedoch die ZIP nur mit der letzten Textdatei erstellt wird, was falsch ist?

Antwort

9

Sie erstellen ZipArchive bei jeder Iteration. Swapping foreach und using sollte es lösen:

Dictionary<string, string> Values = new Dictionary<string, string>(); 
using (var memoryStream = new MemoryStream()) 
{ 
    string zip = @"C:\Temp\ZipFile.zip"; 
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
    { 
     foreach (var item in Values) 
     { 
      var file = archive.CreateEntry(item.Key + ".txt"); 
      using (var entryStream = file.Open()) 
      using (var streamWriter = new StreamWriter(entryStream)) 
      { 
       streamWriter.Write(item.Value); 
      } 
     } 
    } 

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

Jedesmal, wenn foreach-Schleife läuft es ZipArchiveMode hat als erstellen. Das sollte das Problem sein, also erzeugt es jedes Mal neue ZIP mit neuem Inhalt, wie die letzte Textdatei. Erstellen Sie eine Ausnahme für jede Schleife, die nach der ersten ausgeführt werden soll, die gelöst werden soll.