C# 带记忆流的SharpZipLib

C# 带记忆流的SharpZipLib,c#,asp.net,.net,stream,zip,C#,Asp.net,.net,Stream,Zip,我一直在用asp.net开发一个web应用程序,我对SharZipLib有很多疑问。我有一个名为Template.odt的文件(来自Open Office),这个文件是一个压缩文件(如docx),里面还有一些其他文件(manifiest、xml、images等)。我需要打开这个文件,更改一个名为content.xml和styles.xml的文件,并保存在另一个.odt文件中,然后提交给我的客户机。但我不确定是否可以使用临时文件,所以我在考虑如何使用MemoryStream来实现这一点 看看我得到

我一直在用asp.net开发一个web应用程序,我对SharZipLib有很多疑问。我有一个名为Template.odt的文件(来自Open Office),这个文件是一个压缩文件(如docx),里面还有一些其他文件(manifiest、xml、images等)。我需要打开这个文件,更改一个名为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实例获取额外数据,但我得到了空值,这正常吗

有人能帮我吗


谢谢

关于如何在内存中更新ZIP文件的示例可在此处找到:

在您的情况下,您可能必须将
content.xml
加载到
XmlDocument
XDocument
中才能对其进行修改,但这取决于您试图更改的内容

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

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

更多信息:

关于如何在内存中更新ZIP文件的示例,请参见:

在您的情况下,您可能必须将
content.xml
加载到
XmlDocument
XDocument
中才能对其进行修改,但这取决于您试图更改的内容

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

   using(var inputStream = File.OpenRead(Server.MapPath("~/Odt/Template.odt")))
   {
      // ...
   }
有关这方面的更多信息: