将Ionic Zip读取为内存流C#

13

我正在使用Ionic.Zip来提取Zip文件并将其存储在内存流中,方法如下:

private MemoryStream GetReplayZipMemoryStream()
{
    MemoryStream zipMs = new MemoryStream();
    using (ZipFile zip = ZipFile.Read(myFile.zip))
    {
        foreach (ZipEntry zipEntry in zip)
        {
            if (zipEntry.FileName.StartsWith("Aligning") || zipEntry.FileName.StartsWith("Sensing"))
            {
                zipEntry.Extract(zipMs);
            }
        }
    }

    zipMs.Seek(0, SeekOrigin.Begin);
    return zipMs;
}

当我完成提取后,我想读取流并根据条目文件名获取一些条目。我该如何做?

我尝试使用以下代码调用,但在ZipFile.Read(ms)上出现错误,错误信息为:

无法将其读取为ZipFile

Stream ms = GetReplayZipMemoryStream();
using (ZipFile zip = ZipFile.Read(ms))
{
    ZipEntry imageEntry = zip.Entries.First(x => x.FileName.EndsWith(".png"));
    using (Stream s = imageEntry.OpenReader())
    {
        var image = Image.FromStream(s);
        pictureBox1.Image = image;
    }
}

非常感谢您提前提供的帮助!


5
当你使用.Extract()方法后,内存流中的数据不再是压缩格式,而是一系列连续的未压缩文件。 - H H
正如Henk Holterman所建议的那样,除非您正在处理嵌套的zip文件,否则在第二个片段中不应再次解压缩文件。您能提供一下您要解压缩的文件的示例结构吗?或者我建议您在第一个循环中进行所有过滤,甚至可能在那里创建图像,以便不将您想要读取的所有文件写入单个流中。 - Philip Atanassov
2
除了Henk提出的观点之外,我建议您不要使用Ionic.Zip来完成这项任务。.NET现在有ZipArchive类,它提供了处理.zip文件的内置功能,并且在我看来比您现在拥有的代码更方便。 - Peter Duniho
1
@PeterDuniho 除非你不需要处理加密的zip文件,否则它似乎无法处理。如果不需要处理加密的zip文件,那么使用它可能更好。 - LJNielsenDk
1个回答

20

这可能是一个有点老的问题和答案晚了,但我已经做了一些事情来获取文件作为字节集合和它们的文件名,就像这样

public static Dictionary<string, byte[]> Decompress(Stream targFileStream)
{
    Dictionary<string, byte[]> files = new Dictionary<string, byte[]>();

    using(ZipFile z = ZipFile.Read(targFileStream))
    {
        foreach (ZipEntry zEntry in z)
        {
            MemoryStream tempS = new MemoryStream();
            zEntry.Extract(tempS);

            files.Add(zEntry.FileName, tempS.ToArray());
        }
    }

    return files;
}

谢谢。我一直在寻找这个。我没有查看不同的虚拟Extract()函数。 - Hao Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接