2017-10-22 12 views
1

zip 파일에 C#으로 파일 묶음을 추가하려고하는데 제대로 작동하지 않습니다.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 분명히 아무도 모른다. 당신이 답변을 찾으면 u는 upvote 또는 답변을 수 있습니까? –