SharpZipLib



  • Hallo,
    ich verwende die SharpZipLib um meine Daten
    in ein ZipFile zuschreiben.

    Wenn meine Anwendung startet öffne ich initial ein
    FileStream auf das ZipFile:

    mProjectStream = mProjectFile.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
    

    Wenn das Zip-File eventuell durch eine andere Instanz schon gelockt ist
    öffne ich es nur zum lesen:

    mProjectStream = mProjectFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    

    Wenn die Anwendung mit den Schreibrechten
    das zipfile modifiziert

    ZipFile tZipFile = new ZipFile(mProjectStream);
        tZipFile.BeginUpdate();
        tZipFile.Add(...);
        tZipFile.CommitUpdate();
        tZipFile.Close();
    

    dann ist es so, dass nach dem CommitUpdate der Stream scheinbar Dispose beziehungsweise geschlossen wurde und dieser ist dann nicht mehr gelockt.
    Nun könnte ich theoretisch einfach gleich danach ein neuen Stream öffnen der die Datei wieder lockt. Jedoch besteht dann ja eine geringe Chance, dass sich eine andere Instanz den lock holt. Am besten wäre es wenn der Stream gar nicht erst freigegeben würde.

    Kann ich das irgendwie verhindern oder gibt es da einen anderen besseren Lösungsansatz ?

    lG Nahasa



  • Hi, ich habe ne Lösung gefunden
    man kann in der ZipFile Klasse den IsStreamOwner auf falsch setzten:

    ZipFile.IsStreamOwner = false;
    

    dann lässt er den Stream offen.
    Allerdings funktioniert das nicht bei einen FileStream, den schließt er dann trotzdem. Ich hab mir damit geholfen,dass ich das Zip temporär in ein
    MemoryStream kopiere und mit dem arbeite während ich den FileStream offen lasse und somit das File locke. Am ende Schreibe ich den Memorystream zurück.

    MemoryStream tMemoryStream = new MemoryStream();
     mFileStream.Position = 0;
     ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(mFileStream, tMemoryStream, new byte[4096]);
    ....
    ....
       tZipFile = new ZipFile(tMemoryStream);
       tZipFile.IsStreamOwner = false;
       tZipFile.BeginUpdate();
    ......
    ....tZipFile.CommitUpdate();
        tZipFile.Close();
    ...
    ...
    tMemoryStream.Position = 0;
    mFileStream.Position = 0;
    ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(tMemoryStream, mFileStream, new byte[4096]);
    mFileStream.Flush();
    

Anmelden zum Antworten