(最新OAUS版本請參見:自動升級系統的設計與實現(續2) -- 增加斷點續傳功能)
一.緣起
自從 自動升級系統的設計與實現(原始碼) 釋出以後,收到了很多使用者的反饋,其中最多的要求就是希望OAUS服務端增加自動檢測檔案變更的功能,這樣每次部署版本升級時,可以節省很多時間,而且可以避免手動修改帶來的錯誤。
現在,我就簡單介紹一下最新版本的OAUS中關於這個功能的實現。在上一個版本中,我們是這樣操作的:
每次有版本更新時,我們需要把更新的檔案拷貝到服務端的FileFolder資料夾下覆蓋掉舊的檔案,然後通過上述的操作介面,來手動修改每個檔案的版本號。這個過程很繁瑣,而且容易出錯。於是,新版本就增加了自動掃描的功能,一鍵就可以搞定。
新版的操作介面截圖如下所示:
點選“自動掃描”按鈕,服務端就會檢索FileFolder資料夾下檔案的名稱、大小、最後更新時間,然後得出本次更新結果:變化了幾個檔案、新增了幾個檔案、刪除了幾個檔案。
二.原始碼實現
下面簡單說明一下程式碼實現的具體過程。
1.FileUnit類增加 FileSize 和 LastUpdateTime 屬性:這兩個屬性用於作為比對檔案是否發生變化的最根本依據。
2.具體實現程式碼如下:
private void button1_Click(object sender, EventArgs e) { int changedCount = 0; int addedCount = 0; List<FileUnit> deleted = new List<FileUnit>(); List<string> files = ESBasic.Helpers.FileHelper.GetOffspringFiles(AppDomain.CurrentDomain.BaseDirectory + "FileFolder\\"); //第一輪:檢測發生變化和新增的檔案 foreach (string fileRelativePath in files) { FileInfo info = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "FileFolder\\" + fileRelativePath); FileUnit unit = this.GetFileUnit(fileRelativePath); if (unit == null) //新增的檔案 { unit = new FileUnit(fileRelativePath, 1, (int)info.Length, info.LastWriteTime); this.fileConfig.FileList.Add(unit); ++addedCount; } else { //發生變化的檔案 if (unit.FileSize != info.Length || unit.LastUpdateTime.ToString() != info.LastWriteTime.ToString()) { unit.Version += 1; unit.FileSize = (int)info.Length; unit.LastUpdateTime = info.LastWriteTime; ++changedCount; } } } //第二輪:檢測被刪除的檔案 foreach (FileUnit unit in this.fileConfig.FileList) { bool found = false; foreach (string fileRelativePath in files) { if (fileRelativePath == unit.FileRelativePath) { found = true; break; } } if (!found) { deleted.Add(unit); } } foreach (FileUnit unit in deleted) { this.fileConfig.FileList.Remove(unit); } this.fileConfig.Save(); if (changedCount > 0 || addedCount > 0 || deleted.Count > 0) { this.changed = true; this.dataGridView1.DataSource = null; this.dataGridView1.DataSource = this.fileConfig.FileList; string msg = string.Format("更新:{0},新增:{1},刪除:{2}", changedCount, addedCount, deleted.Count); MessageBox.Show(msg); } else { MessageBox.Show("沒有檢測到變化。"); } }
(1)首先,第一輪檢測發生變化的或新增的檔案。
(2)然後,第二輪檢測被刪除的檔案。
(3)每次檢測完畢後,都更新維護的版本號。
最後,我保留了原始的手動更新版本號的功能,以備不時之需。
3. 關於客戶端如何使用升級機制的說明
一般而言,如果最新客戶端程式與老版本相容,不升級也影響不大,則可以交由使用者決定是否升級;如果最新客戶端程式不相容老版本,或者是有重大更新,則將啟動強制升級。如果流程要進入啟動升級,那麼只要啟動AutoUpdater的資料夾下AutoUpdater.exe就可以了。要注意的是,啟動AutoUpdater.exe程式後,要退出當前的客戶端程式,否則,有些檔案會因為無法被覆蓋而導致更新失敗。程式碼大致如下所示:
if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort)) { string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe"; System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath); ......//退出當前程式 }
客戶端執行後,升級過程截圖如下:
三.相關下載
如果有任何建議或問題,請留言給我。
敬請了解:
ESFramework通訊框架 OMCS網路語音視訊框架 MFile語音視訊錄製元件 MCapture語音視訊採集元件 StriveEngine輕量級通訊引擎 OAUS 自動升級系統