2016-07-28 60 views
5

我有一個更新程序,一旦檢測到更新(從遠程XML文件),通過主程序調用它,首先檢查程序是否打開我的更新程序未能關閉我的主程序(C#)

if (clsProcess.ProcessName.ToLower().Contains("conkinator-bot.exe")) 
{ 

    clsProcess.CloseMainWindow(); 
    return true; 

} 

(這被運行的每個進程,直到它找到它(foreach循環))

的更新,然後下載文件:

client.DownloadFile(url, "Conkinator-Bot-new.exe"); 

,然後它試圖刪除當前和R易名是:

File.Delete("Conkinator-Bot.exe"); 
File.Move("Conkinator-Bot-new.exe", "Conkinator-Bot.exe"); 

,但我得到這個時候發生錯誤是:

未處理的異常:System.UnauthorizedAccessException:對路徑「d:\ Conkinator的Skype工具\ Conkinator- Bot.exe'被拒絕。

但是該程序的新版本下載。

+0

嘗試運行您的更新過程管理員 – Glubus

+0

@Glubus當我這樣做,大部分時間它仍然無法正常工作,有時它。 –

+0

嘗試在下載文件之前添加一些延遲,因爲可能您的過程需要一點時間來關閉自己 –

回答

6

僅僅因爲主窗口關閉並不意味着該過程結束。你需要等待進程退出關閉主窗口後:

clsProcess.WaitForExit(); 

理想情況下,你會使用超時 - 有可能是一些防止窗口關閉,或該進程可能有一個錯誤的出口機制。

+0

這個工作,當我測試它只是現在:)謝謝 –

2

從主程序本身關閉主程序要容易得多。

string msg = "To update the application we need to close it. Do you want to continue?"; 
    if (DialogResult.Yes == MessageBox.Show(msg, title, MessageBoxButtons.YesNo)) 
    { 
    ProcessStartInfo psi = new ProcessStartInfo(); 
    psi.FileName = "YourUpdaterFile.exe";   
    psi.WindowStyle = ProcessWindowStyle.Normal; 
    // Assuming a lot here but to just show the options available.... 
    psi.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath); 
    Process.Start(psi); 
    Application.Exit(); 
    }