gpt4 book ai didi

c# - 在内存中编辑 ZipArchive .NET

转载 作者:太空狗 更新时间:2023-10-29 23:53:23 25 4
gpt4 key购买 nike

我正在尝试编辑 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.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);
}
}

以这种方式编辑 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...)”。

关于c# - 在内存中编辑 ZipArchive .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com