一、前言 上篇運用了.Net Remoting技術解決了本地與伺服器版本對比,並下載更新包的過程。 本篇主要是應用Process,來實現重啟程式的過程。 情景假設: Revit2016正載入某dll,其版本為1.0.0.0。伺服器的更新dll版本為1.0.0.10。 下載完後,Revit2016關閉 ...
一、前言
上篇運用了.Net Remoting技術解決了本地與伺服器版本對比,並下載更新包的過程。
本篇主要是應用Process,來實現重啟程式的過程。
情景假設:
Revit2016正載入某dll,其版本為1.0.0.0。伺服器的更新dll版本為1.0.0.10。
下載完後,Revit2016關閉,舊dll刪除,新dll複製到舊dll的所在路徑,重啟Revit2016。
二、代碼
在上篇最後一段代碼的79—80行之前插入如下代碼:
bgk_Update.ReportProgress(100, "正在更新"); Thread t = new Thread(new ThreadStart(Update)); t.Start();
執行Update函數:
public void Update() { string exepath = string.Empty; Process[] ps = Process.GetProcessesByName("Revit"); foreach (Process p in ps) { exepath = p.MainModule.FileName.ToString(); //獲得該進程的exe路徑 p.Kill(); //關閉該進程 } foreach (var module in serverupdatefiles.Keys) //刪除原有的module { System.Threading.Thread.Sleep(1 * 1000); //做個延時,因為進程響應快慢問題,可能會導致報錯如:拒絕訪問...文件或者尚未找到該應用路徑 System.IO.File.Delete(Path.Combine(Config.Dir, module + ".dll")); //將新文件複製到舊文件的文件夾內 } CopyDir(Config.TempDir, Config.Dir); System.Diagnostics.Process.Start(exepath);//重啟該exe }
複製某文件夾的內容到另一個文件夾內:
public static void CopyDir(string srcPath, string aimPath) { try { // 檢查目標目錄是否以目錄分割字元結束如果不是則添加之 if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar) aimPath += Path.DirectorySeparatorChar; // 判斷目標目錄是否存在如果不存在則新建之 if (!Directory.Exists(aimPath)) Directory.CreateDirectory(aimPath); // 得到源目錄的文件列表,該裡面是包含文件以及目錄路徑的一個數組 // 如果你指向copy目標文件下麵的文件而不包含目錄請使用下麵的方法 string[] fileList = Directory.GetFiles(srcPath); // string[] fileList = Directory.GetFileSystemEntries(srcPath); // 遍歷所有的文件和目錄 foreach (string file in fileList) { // 先當作目錄處理如果存在這個目錄就遞歸Copy該目錄下麵的文件 if (Directory.Exists(file)) CopyDir(file, aimPath + Path.GetFileName(file)); // 否則直接Copy文件 else File.Copy(file, aimPath + Path.GetFileName(file), true); } } catch { Console.WriteLine("無法複製!"); } }