Tôi đang cố gắng để chỉnh sửa một tập tin XmlDocument
chứa trong một file Zip:Sửa ZipArchive trong bộ nhớ NET
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);
}
Sau khi thực thi mã này tập tin chứa là không thay đổi. NẾU thay vì xml.Save(st);
Tôi viết xml vào đĩa, tôi đã chỉnh sửa.
Tại sao tệp được chỉnh sửa không được ghi vào mã zip? Làm thế nào để tôi sửa chữa nó?
EDIT:
tôi cập nhật mã:
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);
}
}
Bằng cách này file zip được chỉnh sửa, nhưng nó chỉ hoạt động nếu chiều dài của dòng là như nhau. Nếu tmp
ngắn hơn phần còn lại của st
vẫn còn trong tệp ...
Gợi ý?
Tôi không thấy bạn lưu mã zip ở bất kỳ đâu :) – Luaan
Tôi đã bỏ qua phần lưu 'myZipFileInMemoryStream' vào đĩa. Phần không được chỉnh sửa có được đưa vào luồng không? – Emaborsa
Rõ ràng, nó sẽ - 'Sau khi truy xuất luồng, bạn có thể đọc hoặc ghi vào luồng. Khi bạn ghi vào luồng, các sửa đổi bạn thực hiện cho mục nhập sẽ xuất hiện trong kho lưu trữ zip.' (MSDN). Nhưng bạn cũng phải tua lại luồng - 'st.Position = 0', nếu không bạn chỉ cần thêm XML mới vào cuối tệp cũ. Có thể đó là vấn đề? :) – Luaan