字节数组在传递给另一个方法时损坏

本文关键字:另一个 方法 损坏 字节数 数组 字节 | 更新日期: 2023-09-27 17:52:59

我有一堆字节数组形式的Jpg图像。我想将这些添加到zip文件中,将zip文件转换为字节数组,并将其传递到其他地方。在一个方法中,我有这样的代码:

var response = //some response object that will hold a byte array
    using (var ms = new MemoryStream())
    {
        using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
        {
            var i = 1;
            foreach (var image in images) // some collection that holds byte arrays.
            {
                var entry = zipArchive.CreateEntry(i + ".jpg");
                using (var entryStream = entry.Open())
                using (var compressStream = new MemoryStream(photo.ImageOriginal))
                {
                    compressStream.CopyTo(entryStream);
                }
                    i++;
            }
            response.ZipFile = ms.ToArray();
        }
    using (var fs = new FileStream(@"C:'Users'MyName'Desktop'image.zip", FileMode.Create))
        {
            ms.Position = 0;
            ms.CopyTo(fs);
        }
    }
    return response;

现在,我在底部附近添加了一个文件流,以便立即将其写入zip文件以进行测试。这是有效的,我得到一个zip文件,其中有一个或多个图像在我的桌面上。但是:response.ZipFile不能以同样的方式制作成有效的zipfile。我试过了:

using (var ms2 = new MemoryStream(response.ZipFile))
using (var fs = new FileStream(@"C:'Users'Bara'Desktop'image.zip", FileMode.Create))
{
    ms2.Position = 0;
    ms2.CopyTo(fs);
}

但是这会创建一个无法打开的zip文件。

我要做的是:把response.ZipFile变成一个数组,可以再次变成一个工作的zip文件。我在这段代码中做错了什么?

字节数组在传递给另一个方法时损坏

您怎么知道ZipArchiveDispose不会向底层流写入更多内容?

您应该将这行移动到处置ZipArchive:

之后。
response.ZipFile = ms.ToArray();

完整代码:

var response = //some response object that will hold a byte array
using (var ms = new MemoryStream())
{
    using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
    {
        var i = 1;
        foreach (var image in images) // some collection that holds byte arrays.
        {
            var entry = zipArchive.CreateEntry(i + ".jpg");
            using (var entryStream = entry.Open())
            using (var compressStream = new MemoryStream(photo.ImageOriginal))
            {
                compressStream.CopyTo(entryStream);
            }
            i++;
        }
    }
    response.ZipFile = ms.ToArray();
}
return response;