代码之家  ›  专栏  ›  技术社区  ›  john_vanderholt

C#似乎无法正确地将图像添加到ziparchive

  •  1
  • john_vanderholt  · 技术社区  · 7 年前

    我试图在c#中向zipfile添加一堆文件,但它似乎无法正常工作。

    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 photo viewer中打开它们时,它们似乎已损坏。

    感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Daniel B    4 年前

    几乎花了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())
                    {// to keep it as image better to have it as bytes
                        var bytes = stream.ToArray();
                        entryStream.Write(bytes, 0, bytes.Length); 
                    }
                }
            }
        }
    
        using (var fileStream = new FileStream(@"test.zip", FileMode.Create))
        {
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.CopyTo(fileStream);
        }
    }
    

    我试过了,效果很好!