2016-11-14 2 views
0

ich auf einem Web-Installer gerade arbeite und eines der Dinge, die ich zur Zeit habe, istfür frühere Funktion abzuschließen

void MoveFiles() 
    { 
     lbldlstatus.Text = "Moving Files"; 
     string InstallDirectory = Directory.GetCurrentDirectory() + "/DoxramosRepack-master"; 
     DirectoryInfo d = new DirectoryInfo(InstallDirectory); 
     foreach(var file in d.GetFiles("*")) 
     { 
      try 
      { 
       if (File.Exists(file.Name)) { 
       File.Delete(file.Name); 
      } 

       Directory.Move(file.FullName, file.Name); 
       Cleanup(); 
      } 
      catch(Exception e) 
      { 
       MessageBox.Show(e.ToString()); 
       lbldlstatus.Text = "Repack Installation Failed"; 
      } 
     }    
    } 
    void Cleanup() 
    { 
     lbldlstatus.Text = "Cleaning Up Files"; 
     try 
     { 
      if (File.Exists("Repack.zip")) 
      { 
       File.Delete("Repack.zip"); 
      } 
      if(Directory.Exists("DoxramosRepack-master")) 
      { 
       Directory.Delete("DoxramosRepack-master"); 
      } 
      lbldlstatus.Text = "Repack Installed Successfully"; 
     } 

Als ich Cleanup() erhalte ich eine System.IO.IOException haben.

Prozess kann nicht die Datei Repack.zip zugreifen, da sie durch einen anderen Prozess verwendet werden.

Der vollständige Code läuft

Download-> Extract-> Move-> Cleanup.

Ich bin mir nicht sicher, welcher Prozess verwendet wird, aber ich suche nach einem Weg für jeden Prozess warten auf den vorherigen zu beenden, bevor Sie beginnen.

+0

Ich glaube nicht, dass Sie Async-Methoden überall verwenden, also wahrscheinlich schließen Sie eine Datei nicht korrekt .. –

+1

Der Code zu extrahieren ist wahrscheinlich nicht geschlossen oder entsorgt richtig, wenn Sie versuchen, die ZIP-Datei zu löschen wird noch benutzt. Da der Extraktcode nicht angezeigt wird, kann nicht bestätigt werden, wenn dies der Fall ist. – Nkosi

+0

Wenn ich zurück zu meinem PC komme, werde ich meinen Download werfen, extrahieren und weitermachen, nachdem ich in dispose gelesen habe, wenn das nicht das Problem ist. Danke Jungs –

Antwort

1

Nach Extrakt Code unten

void Extract() 
{ 
    string zipPath = @"Repack.zip"; 
    string extractPath = @"."; 
    try 
    { 
     using (ZipFile unzip = ZipFile.Read(zipPath)) 
     { 
      unzip.ExtractAll(extractPath); 
      lbldlstatus.Text = "Extracting Files"; 
      MoveFiles();    
     } 
    } 
    catch (ZipException e) 
    { 
     MessageBox.Show(e.ToString()); 
     lbldlstatus.Text = "Repack Installation Failed"; 
    } 
} 

Sie Dateien verschieben rufen, bevor Sie fertig mit der Zip-Datei sind. Da die Methode zum Verschieben von Dateien für das Aufrufen der Bereinigungsfunktion verantwortlich ist, sollten Sie sicherstellen, dass die ZIP-Datei bereits gelöscht wurde, bevor Sie versuchen, sie zu löschen.

void Extract() 
{ 
    string zipPath = @"Repack.zip"; 
    string extractPath = @"."; 
    try 
    { 
     using (ZipFile unzip = ZipFile.Read(zipPath)) 
     { 
      unzip.ExtractAll(extractPath); 
      lbldlstatus.Text = "Extracting Files"; 
     } 
     MoveFiles(); 
    } 
    catch (ZipException e) 
    { 
     MessageBox.Show(e.ToString()); 
     lbldlstatus.Text = "Repack Installation Failed"; 
    } 
} 

Bereinigung sollte auch aufgerufen werden, nachdem alles verschoben wurde. Momentan ruft der Beispielcode sie wiederholt in der for-Schleife auf.

+0

Danke, hab nicht mal gemerkt das ich es im using block hatte. (Ich bemerkte die Foreach früher und hatte es behoben, aber danke, dass du es auch aufgezeigt hast) –

1

Der Code, den Sie auf Pastebin eingefügt haben, unterscheidet sich von dem, was Sie hier gepostet haben. Der Code in Pastebin ruft nie Bereinigung auf.

Sowieso ist das Problem, weil Sie MoveFiles() aus dem using Block hier anrufen:

using (ZipFile unzip = ZipFile.Read(zipPath)) 
{ 
    unzip.ExtractAll(extractPath); 
    lbldlstatus.Text = "Extracting Files"; 
    MoveFiles();  
} 

Move it außerhalb der using-Blöcke.

Verwandte Themen