2014-11-24 44 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如创建时间。这应该是问题所在,所以它每次都会生成新的压缩文件,其中包含最新的文本文件。在第一个应该解决的循环之后为每个循环运行创建一个异常。