国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#基于FTP協議的簡易軟件自動升級程序

2019-10-29 21:06:09
字體:
來源:轉載
供稿:網友

最近在重寫了一個老的產品條碼掃描程序,客戶端數越有30個,因為經常有更新,C/S維護非常不方便,所以做一個自動更新程序特別有必要。

在網上隨便找了找自動更新的方案,大多使用VS的發布/更新功能,不太喜歡此方案,覺得太麻煩,然后自己初步琢磨了一下如下方案。

現在比較喜歡的編程方式,先畫圖。

軟件更新流程

C#,FTP,軟件自動升級

安裝包的制作

為了簡單,采用了自解壓壓縮包的方式制作更新包,將整個新程序包打包為一個自解壓壓縮包。

以下是我的自解壓包的參數設置,怎樣制作自解壓包網上有很多教程,可以自己去搜索。

常規-解壓路徑:"c:/barcodeSys"
設置-解壓后運行:"c:/barcodeSys/updateLog.txt"
模式:隱藏啟動對話框。
高級:添加快捷方式到桌面
源文件:"c:/barcodeSys/BarcodeMain.exe"
快捷方式名:條碼掃描程序
更新:解壓替換、覆蓋所有。

制作更新程序

因為軟件在更新時Update程序是一直在運行的,這樣在自解壓包解壓時就會無法替換更新程序,所以將Update程序作為一個單獨的窗體程序來做,由主程序啟動時調用。

制作更新程序前,首先解決怎樣判斷是否存在最新版本的問題,我采用FTP服務器上新建一個文本文檔名稱為SvrVer.txt,內容為最新版本號,本地程序文件夾中建立一個文本文檔名稱為Version,內容為本地程序版本號。方法檢查服務器版本號是否與本地版本一致,如果一致則表示不需要更新,否則相反,如下圖

C#,FTP,軟件自動升級

以下為更新程序下載文件部分的代碼

 

long fileSize = helper.GetFileSize(dir+"/Release.exe");  //獲得更新程序文件大小        fileSizes = fileSize;        if (fileSize > 0)        {          updateLabelDelegate("發現最新版本"+ serVer + "!文件大小:" + fileSize+"字節"); //更新界面label控件的委托          int readSize = 0;          bool result = false;          using (FileStream fs = new FileStream("Release.exe", FileMode.Create))          {            string url = "ftp://" + ftpAddress + "/"+dir+"/Release.exe";            Console.WriteLine(url);            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));            request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);            request.Method = WebRequestMethods.Ftp.DownloadFile; ;            Console.WriteLine(request);            request.ContentOffset = fs.Length;            updateLabelDelegate("正在下載新版本... 0字節/" + fileSize + "字節");              using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())            {              fs.Position = fs.Length;              byte[] buffer = new byte[1024*2];              int count = response.GetResponseStream().Read(buffer, 0, buffer.Length);              while (count > 0)              {                fs.Write(buffer, 0, count);                count = response.GetResponseStream().Read(buffer, 0, buffer.Length);                readSize += count;                double pa = (((double)readSize / (double)fileSizes) * 100);                updateProgDelegate((int)pa) ; //更新進度條的委托                UpdateUILabel("正在下載更新..."+ (readSize) + "字節/" + (fileSize) + "字節");                Application.DoEvents();              }              UpdateUILabel("下載完成,正在安裝新版本,請稍等..." + (fileSize) + "字節/" + (fileSize) + "字節");              updateProgDelegate(100);              response.GetResponseStream().Close();            }          }          Process p = Process.Start("Release.exe");  //下載完成后調用自解壓包          p.WaitForExit();  //等待自解壓包解壓完成      p.StartInfo.FileName = "BarcodeMain.exe";//啟動主程序            p.StartInfo.Arguments = "update";//傳遞主啟動程序的參數,以免啟動主程序后再次啟動更新程序            p.Start();//啟動    this.Close();    //關閉更新程序窗口

主程序的部分小修改

因為每次啟動時主程序時會調用Update程序,同時關閉自身進程以準備更新,所以需要在主程序里做一些小事情,否則陷入啟動主程序-啟動更新程序-啟動主程序的就無限循環中了。

1、修改主程序入口Main方法,增加參數

[STAThread]static void Main(string[] arg) //接受參數{  Application.EnableVisualStyles();  Application.SetCompatibleTextRenderingDefault(false);  Application.Run(new Index(arg)); //傳遞給主程序窗體的構造函數}

2、主程序增加帶參數的構造函數

private string[] targ ; //接收的參數public Index(){  InitializeComponent();}public Index(string[] arg) //帶參數的構造函數{  InitializeComponent();  targ = arg;}

3、判斷是否是否帶參數啟動

//檢查執行參數     private static System.Diagnostics.Process p;if (targ.Length==0)  //如果沒有傳遞參數,則調用update程序 {    if (p == null)   {     p = new System.Diagnostics.Process();      p.StartInfo.FileName = "UpdatePrg.exe";      p.Start();      Application.Exit();        }        else        {          if (p.HasExited) //是否正在運行        {        p.Start();       }     }  p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;}

最終的運行效果

C#,FTP,軟件自動升級

最后推薦一個綠色版比較好用的簡易FTP軟件Quick Easy FTP Server,足以滿足更新所用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沅陵县| 澄城县| 桦川县| 宜良县| 本溪| 旺苍县| 乐亭县| 石渠县| 环江| 门头沟区| 清涧县| 本溪市| 曲阜市| 新巴尔虎左旗| 嘉鱼县| 莱西市| 德清县| 长春市| 腾冲县| 开封县| 高雄市| 凌云县| 白城市| 江永县| 甘泉县| 保亭| 江阴市| 巧家县| 子长县| 罗城| 肥乡县| 临沭县| 怀仁县| 宁阳县| 吴旗县| 建瓯市| 黔江区| 绥芬河市| 伊宁县| 淮滨县| 应用必备|