2016-06-02 6 views
0

Ich habe einige ZIP-Archiv, gibt es viele Dateien/Ordner. Ich möchte einige von ihnen ändern/ihren Inhalt ersetzen.Modyfing eine der Dateien in Zip-Paket

Ich habe einige smaple Code auf einer Website gefunden: http://docs.telerik.com/devtools/silverlight/controls/radziplibrary/features/update-ziparchive.html

aber es funktioniert nicht, wird Datei nicht aktualisiert.

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); 
     } 
    } 

Könnten Sie mir sagen, wie man es beheben? Oder ist die einzige Lösung, zuerst ZipArchiveEntry zu löschen und später ZipArchiveEntry hinzuzufügen?

Antwort

1

Dies sollte mit ein paar Änderungen funktionieren, vorausgesetzt der Zip wird im Update-Modus geöffnet. Wird der Code definitiv ausgeführt?

Es gibt ein paar Probleme. Erstens werden Sie Ihren StreamWriter nicht leeren. Sie sollten Flush explizit nach der Write-Methode aufrufen, da andernfalls die Daten möglicherweise erst dann in den Stream geschrieben werden, wenn das Objekt abgeschlossen ist. Zu diesem Zeitpunkt kann der Stream geschlossen werden.

In ähnlicher Weise rufen Sie nicht Close auf StencilStream, und es ist möglich, dass dies das eigentliche Update der ZIP-Datei auslösen wird, obwohl ich glaube, dass dies mit dem äußeren StreamReader entsorgt wird.

Auch ich nehme an, Sie wissen, dass dieser Code an den vorhandenen Dateiinhalt anhängen würde, anstatt ihn zu ersetzen? Verkettetes XML ist nicht sehr nützlich.

+0

Vielen Dank, ich habe hinzugefügt Spülen und es funktioniert jetzt. Mir war klar, dass es Text anhängt, nicht ersetzt, aber ich wollte nur testen, ob es hinzugefügt wird. – buks

Verwandte Themen