【C#】線上更新--解壓
阿新 • • 發佈:2019-01-06
上一篇部落格,分享瞭如何通過程式下載伺服器中的更新檔案,這次我為大家分享一下,如何將下載好的更新檔案的壓縮包解壓並替換掉之前的檔案。
1.由於我們設定的是程式關閉之後提醒使用者,是否更新軟體,所以我們需要將解壓的程式獨立出來,否則,更新程式和執行的程式同時執行會導致,無法替換舊版本的系統。
2.由於解壓程式和系統程式分離,所以我們解壓之前,需要判斷(與伺服器的版本號進行對比),是否觸發解壓程式。
解壓程式碼(解壓程式中):
/// <summary> /// 更新檔案成功方法(返回true/false) /// </summary> /// <param name="dir">本地程式執行路徑</param> /// <param name="zipfile">本地壓縮檔案路徑</param> /// <returns></returns> public bool Replace() { //建立服務客戶端 UpdateServiceClient client = new UpdateServiceClient(); //接受伺服器的版本等資訊 List<string> stringList = client.SelectVersion(); //檔名 string fileName = stringList[1].ToString(); // GetCurrentDirectory // 摘要:獲取應用程式的當前工作目錄 // 返回結果:包含當前工作目錄的路徑且不以反斜槓 (\) 結尾的字串。 string dir = Directory.GetCurrentDirectory(); //壓縮包的路徑 string zipfile = Path.Combine(dir, fileName + ".zip"); //當前工作目錄中新建臨時檔案NewVersion存放新版本檔案 string extractPath = Path.Combine(dir,"version"); //解壓縮檔案到NewVersion中 ZipFile.ExtractToDirectory(zipfile, extractPath); //遍歷所有解壓出來的檔案 foreach (string item in Directory.GetFiles(extractPath)) { //把檔案更新到程式執行路徑 File.Copy(item, System.IO.Path.Combine(dir, System.IO.Path.GetFileName(item)), true); } //刪除壓縮包 File.Delete(zipfile); DirectoryInfo di = new DirectoryInfo((extractPath)); //刪除臨時資料夾 di.Delete(true); return true; }
系統退出的方法中新增啟動解壓程式(執行程式中):
// 獲取當前執行程式的路徑 string dir = Directory.GetCurrentDirectory(); // 例項化下載類 DownLoad dl = new DownLoad(); // 判斷是否有版本 // isUpdate方法去判斷是否需要更新 // 此方法上片部落格裡有方法體 if (dl.IsUpdate()) { // 啟動一個新的程式 Process unZip; // 程式的路徑和名字 unZip= Process.Start(dir + "\\update" + ".exe"); }
大家需要注意的就是:我們需要把解壓程式中生成的exe以及所需的dll拷貝到執行程式bin中的debug檔案中(與Process.Start()中的路徑相同就可以)。
核心程式碼的話就這些了,關於伺服器的設定,可以將更新的檔案打成壓縮包,然後釋出到IIS服務上,然後使用ftp協議進行傳輸,這樣可能不太安全,所以也可以同nigx反向代理,將壓縮包方法網站上,通過http協議進行傳輸。
小編只是簡單總結實現,如有不足,歡迎大神指點!