2017-11-27 1 views
0

Ich habe eine "Arbeitsliste Stil" -Anwendung, wo der Benutzer eine Zip-Datei aus einer Liste auswählt und dann auf eine Schaltfläche klickt, um es in einen lokalen Ordner zu entpacken. HierKann dieselbe Datei nicht zweimal entpacken?

ist ein Auszug aus dem Code verwendet:

ZipFile zip = Ionic.Zip.ZipFile.Read(sourcePackage); 
zip.ExtractAll(destination); 
zip.Dispose(); 

Alles funktioniert gut das erste Mal, aber wenn der Benutzer wieder die gleiche Datei zu entpacken versucht (auch nach ein paar anderen unzipping), es geht zu schnell und alles, was im Zielordner erstellt wird, sieht wie eine temporäre Datei aus (zB 'x2hiex0z.pj0').

Es ist, als ob Ionic.Zip.ZipFile.Read einen Cache von zuvor entpackten Dateinamen erstellt.

Wenn ja, wie lösche ich es, damit ich es zwingen kann, die Datei erneut zu entpacken?

+0

als eine Randnotiz, wenn einige Ihr Code beinhaltet ein 'IDisposable' wie 'ZipFile', es ist die beste Vorgehensweise, eine' using' Klausel zu verwenden. (Und wenn das Ende des Verwendungsblocks erreicht ist, wird automatisch Dispose() für Sie aufgerufen) – Pac0

+0

Wenn Sie Ihre Anwendung debuggen, gibt es dann eine Ausnahme, wie in einer Antwort unten vorgeschlagen? Wenn ja, bitte geben Sie die Fehlermeldung an. – Pac0

+0

Ich bekomme eine Ausnahme "Diese Operation wurde bereits OperationCompleted aufgerufen und weitere Aufrufe sind illegal.". Also muss ich nur klären, was das alles speichert. –

Antwort

0

I gues Sie irgendeine Art von einem bekommen "Datei vorhanden" -Exception

Versuchen:

OpenFileDialog open = new OpenFileDialog(); 
open.Filter = "zip Datei (.zip)|*.zip"; 
open.RestoreDirectory = true; 

if (open.ShowDialog() == DialogResult.OK) 
{ 
    try 
    { 
    ZipFile zip = Ionic.Zip.ZipFile.Read(open.FileName); 
    zip.ExtractAll(".\\"); 
    zip.Dispose(); 
    } 
    catch (ZipException zex) 
    { 
    MessageBox.Show(zex.Message); 
    } 
} 

oder mit einem Thema:

private void open() 
{ 
    OpenFileDialog open = new OpenFileDialog(); 
    open.Filter = "zip Datei (.zip)|*.zip"; 
    open.RestoreDirectory = true; 

    if (open.ShowDialog() == DialogResult.OK) 
    { 

      Thread t1 = new Thread 
      (delegate() 
      { 
       try 
       { 
        using (ZipFile zip = Ionic.Zip.ZipFile.Read(open.FileName)) 
        { 
         zip.ExtractProgress += zip_ExtractProgress; 
         zip.ExtractAll(".\\", ExtractExistingFileAction.OverwriteSilently); 
        } 
       } 
       catch (ZipException zex) 
       { 
        error(zex.Message); 
       } 
      }); 
      t1.IsBackground = true; 
      t1.Start(); 

    } 
} 


private void zip_ExtractProgress(object sender, ExtractProgressEventArgs args) 
{ 
    update(args.TotalBytesToTransfer, args.BytesTransferred); 
} 



private void update(long ueTotal, long done) 
{ 

    if (this.InvokeRequired) 
    { 
     this.Invoke(new MethodInvoker(() => { update(ueTotal, done); })); 
    } 
    else 
    { 
     if (ueTotal > 0) 
     { 
      double prz = (100d/ueTotal) * done; 
      lblProz.Text = prz.ToString("###.##"); 
     } 
    } 
} 
+0

OperationCompleted, das klingt wie ein ** BackgroundWorker ** poste bitte mehr Code mit deinem Async-Kram. – Flocke

+0

Ich glaube, die IonicZip-Bibliothek ist asynchron. Ich verwende zip.ExtractProgress, um den Fortschritt zu verfolgen. Es ist, als ob die Bibliothek sich daran erinnert, dass sie bereits die ZIP-Datei entzippen, die ich entzippen möchte. –

+0

Versuchen Sie: zip.ExtractAll (". \\", ExtractExistingFileAction.OverwriteSilently); – Flocke

Verwandte Themen