2017-10-22 6 views
1

C#でzipファイルにたくさんのファイルを追加しようとしていますが、正しく動作していないようです。C#でziparchiveに画像を正しく追加できないようです。

using (var memoryStream = new MemoryStream()) 
{ 
    using (var zip = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
    { 
     for (int i = 0; i < kaart_data.GetLength(0); i++) 
     { 
      Image img = array[i]; 

      var file = zip.CreateEntry(i + ".bmp"); 
      using (var stream = new MemoryStream()) 
      { 
       img.Save(stream, ImageFormat.Bmp); 
       using (var entryStream = file.Open()) 
       { 
        stream.CopyTo(entryStream); 
       } 
      } 
     } 
    } 

    //saves the archive to disk 
    using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create)) 
    { 
     memoryStream.Seek(0, SeekOrigin.Begin); 
     memoryStream.CopyTo(fileStream); 
    } 
} 

実際には、期待されるファイルサイズのディスクにzipファイルを作成して保存しますか?

しかし、私はそれらをWindowsの写真ビューアで開こうとすると、破損しているようです。

何か助けていただければ幸いです。

答えて

2

問題の原因を突き止めるのにほとんど3時間かかりました。元の画像のサイズを見て抽出した場合、小さな違いがあります。

using (var memoryStream = new MemoryStream()) 
{ 
    using (var zip = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
    { 
     for (var i = 0; i < images.Length; i++) 
     { 
      var img = images[i]; 
      var file = zip.CreateEntry(i + ".bmp"); 
      using (var stream = new MemoryStream()) 
      { 
       img.Save(stream, ImageFormat.Bmp); 
       using (var entryStream = file.Open()) 
       { 
        var bytes = stream.ToArray(); -- to keep it as image better to have it as bytes 
        entryStream.Write(bytes, 0, bytes.Length); 
       } 
      } 
     } 
    } 

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

私はそれを魅力的に動作させようとしました!

+1

なぜ、ストリームをbytearrayに変換するのが助かりますが、それは完全に機能します。ありがとう! –

+0

@john_vanderholt https://stackoverflow.com/questions/46880345/adding-correctly-images-to-ziparchive明らかに誰も知らない。あなたが答えを見つけたら、アップアップしたり、答えたりできますか? –

関連する問題