2014-11-24 43 views
6

我想如下創建具有多個文本文件的ZIP壓縮文件創建ZIP檔案:C#與多個文件

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

然而,ZIP僅與最後一個文本文件中創建的,什麼是錯的?

回答

9

您在每次迭代中創建ZipArchive。交換foreachusing應該解決這個問題:

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

您的每一個foreach循環運行它有ZipArchiveMode如創建時間。這應該是問題所在,所以它每次都會生成新的壓縮文件,其中包含最新的文本文件。在第一個應該解決的循環之後爲每個循環運行創建一個異常。