在zip包里面调整一个文件

时间:2016-06-02 15:10:19

标签: c# stream zip

我有一些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?

1 个答案:

答案 0 :(得分:1)

如果在更新模式下打开zip,则应该进行一些修改。代码肯定是在执行吗?

有几个问题。首先,您不是在刷新StreamWriter。您应该在Write方法之后显式调用Flush,否则在对象完成之前,数据可能不会全部写入流中,此时可能会关闭流。

同样地,你没有在stencilStream上调用Close,并且它可能会触发ZIP文件的实际更新,但我相信这将会被外部StreamReader处理掉。

此外,我假设您知道此代码会附加到现有文件内容而不是替换它?连接XML没什么用处。