分享一個客戶端程序(winform)自動升級程序,思路+說明+源碼


    做winform的程序,不管用沒用過自動更新,至少都想過自動更新是怎么實現的.

    我這里共享一個自動更新的一套版本,給還沒下手開始寫的人一些幫助,也希望有大神來到,給指點優化意見.

    本初我是通過socket來傳輸文件的,后來因為傳大文件出現異常,前期又沒有定義比較好的協議,后來就改用webservices了.

    自動更新分三個部分,服務端(webservice服務,配置與更新),配置客戶端(或叫發布客戶端),客戶端(主程序)

    服務端:        

        ConfigServer.asmx

                 因為代碼共享了,就不傳代碼了,發個截圖吧.

                 

      負責與配置客戶端交互,對文件的發布(軟件上傳),及版本維護.

      這里為了考慮大文件的問題,每次上傳是分包傳送的.UploadFileModel 是分包的定義,這個由配置端來決定分包值.

                 

public class UploadFileModel
    {
        string _RelativePath;
        /// <summary>
        /// 相對路徑
        /// </summary>
        public string RelativePath
        {
            set
            {
                _RelativePath = value;
            }
            get
            {
                if (_RelativePath != string.Empty && _RelativePath.Substring(_RelativePath.Length - 1) != "\\")
                {
                    _RelativePath += "\\";
                }
                return _RelativePath;
            }
        }
        /// <summary>
        /// 文件名
        /// </summary>
        public string FileName { set; get; }
        /// <summary>
        /// 文件流
        /// </summary>
        public byte[] FileStream { set; get; }
        /// <summary>
        /// 開始該文件位置
        /// </summary>
        public int StartPosition { set; get; }
        /// <summary>
        /// 是否完成該文件的傳送了
        /// </summary>
        public bool IsFinish { set; get; }
        /// <summary>
        /// 整個文件流的長度
        /// </summary>
        public long FileStreamLength { set; get; }
        /// <summary>
        /// 文件的最后更新時間
        /// </summary>
        public DateTime FileLastTime { set; get; }
        /// <summary>
        /// 當前是第幾包
        /// </summary>
        public int CurrentPackIndex { set; get; }
        /// <summary>
        /// 總共第幾包
        /// </summary>
        public int MaxPackIndex { set; get; }
    }

       考慮上傳的文件內容有可能含子文件夾,這里有相對路徑的配置.

        UpdateServer.asmx  負責與客戶端交互,用於下載需要更新的文件.

      

       有兩個服務,GetFileList 獲取文件列表,與本地文件通過版本號篩選出要更新的文件信息.

               GetFile 用於更新文件,RequestFileModel 定義了要請求文件的指定長度的文件流(其實也是可以按分包來下載,具體怎么分包是有客戶端來定義)

               

public class RequestFileModel
    {
        /// <summary>
        /// 文件id
        /// </summary>
        public long FileId { set; get; }
        /// <summary>
        /// 開始該文件位置
        /// </summary>
        public int StartPosition { set; get; }
        /// <summary>
        /// 讀取文件流的長度(一次讀取多少字節)
        /// </summary>
        public int ReadFileLength { set; get; }
    }

  

    配置客戶端:

        

     主界面操作比較簡單,需要注意的就是發布的時候是選擇一個發布文件夾,要發布的文件由該文件夾指定,因為要獲取相對路徑.

         

        上傳文件的具體流程代碼就不發了,下載源碼自己看吧,分包的發送,不過是計算出每次發送的字節,告訴服務器發了多少,是不是完成了.

    更新客戶端:

         

      我這寫的更新客戶端比較簡單而已不是自動,需要手動點擊,這個根據需求可以稍微改一下,或者干脆不用這個界面,因為上傳的相關操作已經封裝起來了.

      本地文件信息我是通過一個FileInfo.data的文件來記錄的.

      關於app.config里面有三個配置項.

       

       DownloadPath 是更新的文件放到哪個文件夾下.

       UpdateServerUrl 是webservices的服務地址.

       MainApp 更新完成之后需要更新的主程序,通過Process.Start()方法來調用.

       當所有文件下載完成后,會把FileInfo.data 文件信息更新.

 

最后總結一下自動更新的整體流程:

     1.訪問更新服務,獲取所有文件信息.

     2.比較服務器文件信息,與本地文件信息做比較,篩選出需要下載的文件信息;

     3.下載需要更新的文件,保存至指定目錄下.

     4.如果指定目錄存在,將指定目錄下的文件替換現有程序文件,刪除已更新的文件夾及所有文件,然后啟動主程序;

     5.啟動主程序,並替換更新程序(如果需要更新的話,更新程序會起別名放於相同目錄下)

 

共享代碼里webservices端有兩個類庫,這個數據操作,配置內容是放到sqlite庫中的,這兩個類庫可在bin下找到.

 

    源碼下載

 

突然看到一個很不錯的自動升級項目,來給大家分享一下, https://github.com/iccfish/FSLib.App.SimpleUpdater

文件上傳下載是基於http,配置及使用看起來很成熟全面.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM