在内存中编辑 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...)".
我正在尝试编辑 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...)".