在内存中编辑 ZipArchive .NET

Edit ZipArchive in memory .NET

我正在尝试编辑 Zip 文件中包含的 XmlDocument 文件:

var zip = new ZipArchive(myZipFileInMemoryStream, ZipArchiveMode.Update);
var entry = zip.GetEntry("filenameToEdit");
using (var st = entry.Open())
{
    var xml = new XmlDocument();
    xml.Load(st);
    foreach (XmlElement el in xml.GetElementsByTagName("Relationship"))
    {
        if(el.HasAttribute("Target") && el.GetAttribute("Target").Contains(".dat")){
            el.SetAttribute("Target", path);
        }
    }
    xml.Save(st);
}

执行此代码后,包含的文件没有改变。如果我将 xml 写入磁盘而不是 xml.Save(st);,我得到了编辑过的。

为什么编辑后的文件没有写入zip?我该如何解决?

编辑:

我更新了代码:

var tmp = new MemoryStream();
using (var zip = new ZipArchive(template, ZipArchiveMode.Read, true))
{
    var entry = zip.GetEntry("xml");
    using (var st = entry.Open())
    {
        var xml = new XmlDocument();
        xml.Load(st);
        foreach (XmlElement el in xml.GetElementsByTagName("Relationship"))
        {
            if (el.HasAttribute("Target") && el.GetAttribute("Target").Contains(".dat"))
            {
                el.SetAttribute("Target", path);
            }
        }
        xml.Save(tmp);
    }
}
using (var zip = new ZipArchive(template, ZipArchiveMode.Update, true))
{
    var entry = zip.GetEntry("xml");
    using (var st = entry.Open())
    {
        tmp.Position = 0;
        tmp.CopyTo(st);
    }
}

以这种方式编辑了 zip 文件,但只有在流的长度相等时才有效。如果 tmp 较短,st 的其余部分仍在文件中...

提示?

我使用此代码创建一个 Zip InMemory(使用 DotNetZip 库):

        MemoryStream saveStream = new MemoryStream();

        ZipFile arrangeZipFile = new ZipFile();
        arrangeZipFile.AddEntry("test.xml", "content...");
        arrangeZipFile.Save(saveStream);

        saveStream.Seek(0, SeekOrigin.Begin);
        saveStream.Flush(); // might be useless, because it's in memory...

之后我在 MemoryStream 中有了一个有效的 Zip。我不确定为什么要添加 Flush() - 我猜这是多余的。

要编辑现有的 Zip,您可以在 MemoryStream 中读取它,而不是创建 "new ZipFile()" 使用 "new ZipFile(byteArray...)".