2016-05-07 26 views
4

2つのテキストファイルをzipファイルに圧縮しようとしています。これは私のパブリックメソッドがどのように見えるかです:このアプローチでは複数のファイルをzipファイルで圧縮する方法

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フォルダが完全に作成されます。

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

これは私の圧縮方法がどのように見えるかです。しかし、問題は、私はzipフォルダ内に1つだけのファイルを取得している(ちょうど2番目のファイルは、zipフォルダ内に作成されます)です。 エラーは見つかりませんでした。

質問:両方のテキストファイルをzipフォルダに圧縮するにはどうすればよいですか?

ありがとうございました!

答えて

7

あなたのコードは、実際にzip.zipファイル(各ファイルを圧縮するための新しいZipArchiveが作成される)への2つの別々のzipアーカイブを保存しています。最初のzipアーカイブにはfile1.txt、次のファイルにはfile2.txtのみが含まれています。 Windowsエクスプローラでzip.zipを開くと、2番目のzipアーカイブの内容が表示されます。

ちょうどあなたfileListループのZipArchive外の作成移動、両方のファイルを含む単一のzipアーカイブを作成するには:一見

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

を、私はusing var (archive = new ZipArchive...)周りにあなたのforeach文があることを示唆しているが間違った方法ラウンド。

foreachループを繰り返すたびに、この方法で新しいZipArchiveを作成します。

きっとあなたはその内部foreachを通じてZipArchive、ループを作成したいですか?このよう

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

関連する問題