我有一些ZIP存档,有很多文件/文件夹。我想修改其中一些/替换他们的内容。
我在网站上找到了一些简单的代码:http://docs.telerik.com/devtools/silverlight/controls/radziplibrary/features/update-ziparchive.html
但它不起作用,文件未更新。
ZipArchiveEntry stencilEntry = archive.GetEntry(SBSX.StencilEntry.FullName);//entries.Where(c => c.Name == "stencil.xml").FirstOrDefault();
Stream stencilStream = stencilEntry.Open();//archive.GetEntry(SBSX.StencilEntry.FullName);// SBSX.StencilEntry.Open();
using (StreamReader ts = new StreamReader(stencilStream))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(ts.ReadToEnd());
if (xmlDoc.DocumentElement.Name == "Stencil")
{
stencilStream.Position = 0;
Stencil stencil = SupportXML.ReturnObjectFromXML<Stencil>(stencilStream);
if (SBSX.Display==DisplayType.IconAndName)
{
stencil.DefaultControlDisplayStyle = DisplayType.IconAndName.ToString();
}
else if (SBSX.Display==DisplayType.IconOnly)
{
stencil.DefaultControlDisplayStyle = DisplayType.IconOnly.ToString();
}
XmlSerializer serializer = new XmlSerializer(typeof(Stencil));
using (MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, stencil);
stream.Seek(0, SeekOrigin.Begin);
var sr = new StreamReader(stream);
var myStr = sr.ReadToEnd();
stream.Seek(0, SeekOrigin.Begin);
stencilStream.Seek(0, SeekOrigin.End);
StreamWriter writer = new StreamWriter(stencilStream);
writer.Write(myStr);
}
}
你能告诉我如何解决这个问题吗?或者也许唯一的解决方案是首先删除ZipArchiveEntry,然后再添加新的ZipArchiveEntry?
答案 0 :(得分:1)
如果在更新模式下打开zip,则应该进行一些修改。代码肯定是在执行吗?
有几个问题。首先,您不是在刷新StreamWriter。您应该在Write方法之后显式调用Flush,否则在对象完成之前,数据可能不会全部写入流中,此时可能会关闭流。
同样地,你没有在stencilStream上调用Close,并且它可能会触发ZIP文件的实际更新,但我相信这将会被外部StreamReader处理掉。
此外,我假设您知道此代码会附加到现有文件内容而不是替换它?连接XML没什么用处。