2014-11-24 19 views
6

Próbuję utworzyć archiwum ZIP z wielu plików tekstowych w następujący sposób:C# Tworzenie archiwum zip z wieloma plikami

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); 
    } 
} 

Jednak pocztowy jest tworzony tylko ostatniego pliku tekstowego, co się dzieje?

Odpowiedz

9

Tworzysz ZipArchive w każdej iteracji. Zamiana foreach i using należy go rozwiązać:

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

każdym razem, gdy pętla foreach biegnie ona ma ZipArchiveMode jako Utwórz. To powinien być problem, więc za każdym razem tworzy nowy zip z nową zawartością, taką jak ostatni plik tekstowy. Utwórz wyjątek dla każdej pętli uruchomionej po pierwszej, którą należy rozwiązać.