SharpZipLib与记忆流



我一直在用asp.net开发一个web应用程序,我对SharZipLib有一些疑问。我有一个名为Template.odt的文件(来自Open Office),这个文件是一个压缩文件(如docx),我们在它里面有一些其他文件(manifest, xml,图像等)。我需要打开这个文件,更改一个名为content.xml和styles.xml的文件,并保存在另一个.odt文件中,然后给我的客户端。但是我不确定我们是否可以使用临时文件,所以我在想如何使用MemoryStream来做到这一点。

看我得到了什么:

protected byte[ GetReport() {
    Stream inputStream = File.OpenRead(Server.MapPath("~/Odt/Template.odt"));
    var zipInputStream = new ZipInputStream(inputStream);
    var outputStream = new MemoryStream();
    var zipOutputStream = new ZipOutputStream(outputStream);
    ZipEntry entry = zipInputStream.GetNextEntry();
    while (entry != null) {     
        if (entry.Name == "content.xml") 
            // how change the content ?
        else if (entry.Name == "styles.xml") 
            // how change the content ?
        // how to add it or create folders in the output ?
        zipOutputStream.Write( ??? );
        entry = zipInputStream.GetNextEntry();
    }
    zipOutputStream.Flush();
    return outputStream.ToArray();
}

我不确定它是否正确,但我认为它正在前进。

我尝试从ZipEntry实例中获取ExtraData,但我得到了null,这是正常的吗?

有人能帮帮我吗?

谢谢

如何在内存中更新ZIP文件的示例如下:http://wiki.sharpdevelop.net/SharpZipLib_Updating.ashx Updating_a_zip_file_in_memory_1

在您的情况下,您可能必须将content.xml加载到XmlDocumentXDocument中以修改它-但这取决于您想要更改的内容。

作为旁注:当使用流时,确保你正在处理它们。最简单的方法是将操作包装在using语句中:

   using(var inputStream = File.OpenRead(Server.MapPath("~/Odt/Template.odt")))
   {
      // ...
   }

更多信息:http://www.codeproject.com/Articles/6564/Understanding-the-using-statement-in-C

相关内容

  • 没有找到相关文章

最新更新