2016-11-14 121 views
0

我工作的一個Web安裝程序和的事情,我有一個目前等待上一次函數來完成

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

當我到Cleanup()我有一個System.IO.IOException

進程無法訪問該文件Repack.zip,因爲它被另一個進程 所使用。

完整代碼運行

下載 - >提取物 - > MOVE->清理。

我不確定正在使用哪個進程,但我正在尋找一種方法讓每個進程在開始之前等待前一個進程完成。

+0

我不認爲你在任何地方使用異步方法,所以可能你沒有正確關閉文件。 –

+1

提取的代碼可能沒有被正確關閉或處理,因此當你試圖刪除zip文件時仍在使用中。鑑於提取代碼未顯示,如果確實如此,則無法確認。 – Nkosi

+0

當我回到我的電腦時,我會拋出我的下載,解壓縮並在閱讀後移至粘貼文件夾中,如果這不是問題。謝謝你們 –

回答

1

根據下面

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

你完成與ZIP文件之前,您所呼叫的移動文件提取碼。看到移動文件方法負責調用清理功能,那麼您應該確保該zip文件在嘗試刪除之前已經處理完畢。

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

清理過程也應在所有內容都被移動後調用。目前示例代碼在for循環中重複調用它。

+0

謝謝,甚至沒有注意到我在使用塊中。 (我注意到之前的foreach並已修復它,但也要感謝您指出它) –

1

您粘貼在pastebin上的代碼與您在此處發佈的代碼不同。 pastebin中的代碼永遠不會調用清理。

反正這個問題是因爲你從這裏using塊內調用MoveFiles()

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

移動它的使用外塊。