在内存.NET中编辑ZipArchive

Ema*_*rsa 5 c# xmldocument edit ziparchive

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

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);
}
Run Code Online (Sandbox Code Playgroud)

执行此代码后,所包含的文件不会更改.如果不是xml.Save(st);我把xml写入磁盘,我得到了编辑过的.

为什么编辑后的文件没有写入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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

提示?

Rob*_*sig -1

我使用此代码创建一个 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...
Run Code Online (Sandbox Code Playgroud)

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

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