2017-10-22 160 views
1

我试图将一堆文件添加到C#中的zipfile,但它似乎不能正常工作。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); 
    } 
} 

事情是它创建并保存压缩文件到磁盘与预期的文件大小。

但是,当我尝试在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显然没人知道。如果你找到答案,你可以高兴或回答 –