自動升級系統OAUS的設計與實現(續) (附最新源碼)

  (最新OAUS版本請參見:自動升級系統的設計與實現(續2) -- 增長斷點續傳功能html

一.緣起    

  自從 自動升級系統的設計與實現(源碼) 發佈之後,收到了不少使用者的反饋,其中最多的要求就是但願OAUS服務端增長自動檢測文件變動的功能,這樣每次部署版本升級時,能夠節省不少時間,並且能夠避免手動修改帶來的錯誤。spring

  如今,我就簡單介紹一下最新版本的OAUS中關於這個功能的實現。在上一個版本中,咱們是這樣操做的: 網絡

      

  每次有版本更新時,咱們須要把更新的文件拷貝到服務端的FileFolder文件夾下覆蓋掉舊的文件,而後經過上述的操做界面,來手動修改每一個文件的版本號。這個過程很繁瑣,並且容易出錯。因而,新版本就增長了自動掃描的功能,一鍵就能夠搞定。框架

  新版的操做界面截圖以下所示:this

  

  點擊「自動掃描」按鈕,服務端就會檢索FileFolder文件夾下文件的名稱、大小、最後更新時間,而後得出本次更新結果:變化了幾個文件、新增了幾個文件、刪除了幾個文件。spa

二.源碼實現

  下面簡單說明一下代碼實現的具體過程。設計

1.FileUnit類增長 FileSize 和 LastUpdateTime 屬性:這兩個屬性用於做爲比對文件是否發生變化的最根本依據。code

2.具體實現代碼以下:orm

    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);     
       ......//退出當前進程  
  } 

  客戶端運行後,升級過程截圖以下:

      

三.相關下載

1.自動升級系統OAUS - 源碼

2.自動升級系統OAUS(可直接部署) 

3.自動升級系統OAUS - 使用手冊

  若是有任何建議或問題,請留言給我。

 

敬請了解:

ESFramework通訊框架     OMCS網絡語音視頻框架     MFile語音視頻錄製組件    MCapture語音視頻採集組件  StriveEngine輕量級通訊引擎    OAUS 自動升級系統 

相關文章
相關標籤/搜索