SharpZipLib с MemoryStream - PullRequest
       25

SharpZipLib с MemoryStream

1 голос
/ 23 ноября 2011

Я занимаюсь разработкой веб-приложения с помощью asp.net, и у меня есть вопрос о SharZipLib.У меня есть файл с именем Template.odt (из Open Office), и этот файл является сжатым файлом (например, docx), и у нас есть несколько других файлов (manifest, 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();
}

Я не уверен, еслиэто правильно, но я думаю, что это в пути.

Я пытаюсь взять ExtraData из экземпляра ZipEntry, но я получил его null, это нормально?

Может кто-нибудь мне помочь?

Спасибо

1 Ответ

1 голос
/ 26 января 2012

Пример того, как вы можете обновить ZIP файлы в памяти, можно найти здесь: http://wiki.sharpdevelop.net/SharpZipLib_Updating.ashx#Updating_a_zip_file_in_memory_1

В вашем случае вам, вероятно, придется загрузить content.xml в XmlDocument или XDocument, чтобы изменить его, но это зависит от того, что именно вы пытаетесь изменить.

В качестве дополнительного признака: при использовании потоков убедитесь, что вы избавляетесь от них. Самый простой способ - обернуть операцию в оператор using:

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

Подробнее об этом: http://www.codeproject.com/Articles/6564/Understanding-the-using-statement-in-C

...