修改 zip 包中的一个文件
Modyfing one of files inside zip package
我有一些 ZIP 存档,还有很多 files/folders。我想修改一些them/replace他们的内容。
我在网站上找到了一些示例代码: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?
如果在更新模式下打开 zip,这应该可以进行一些修改。代码肯定被执行了吗?
有几个问题。首先,您没有刷新 StreamWriter。您应该在 Write 方法之后显式调用 Flush,否则在对象完成之前,数据可能不会全部真正写入流中,此时流可能会关闭。
同样,您没有在 stencilStream 上调用 Close,并且可能这会触发 ZIP 文件的实际更新,尽管我相信这会被外部 StreamReader 处理掉。
我还假设您知道此代码将附加到现有文件内容而不是替换它?串联 XML 没有多大用处。
我有一些 ZIP 存档,还有很多 files/folders。我想修改一些them/replace他们的内容。
我在网站上找到了一些示例代码: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?
如果在更新模式下打开 zip,这应该可以进行一些修改。代码肯定被执行了吗?
有几个问题。首先,您没有刷新 StreamWriter。您应该在 Write 方法之后显式调用 Flush,否则在对象完成之前,数据可能不会全部真正写入流中,此时流可能会关闭。
同样,您没有在 stencilStream 上调用 Close,并且可能这会触发 ZIP 文件的实际更新,尽管我相信这会被外部 StreamReader 处理掉。
我还假设您知道此代码将附加到现有文件内容而不是替换它?串联 XML 没有多大用处。