一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#基于FTP協議的簡易軟件自動升級程序

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

2022-02-22 13:31奚云刀 C#

這篇文章主要為大家詳細介紹了C#基于FTP協議的簡易軟件自動升級程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

軟件更新流程

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

安裝包的制作

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

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

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

制作更新程序

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

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

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

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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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方法,增加參數

?
1
2
3
4
5
6
7
[stathread]
static void main(string[] arg) //接受參數
{
  application.enablevisualstyles();
  application.setcompatibletextrenderingdefault(false);
  application.run(new index(arg)); //傳遞給主程序窗體的構造函數
}

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

?
1
2
3
4
5
6
7
8
9
10
private string[] targ ; //接收的參數
public index()
{
  initializecomponent();
}
public index(string[] arg) //帶參數的構造函數
{
  initializecomponent();
  targ = arg;
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//檢查執行參數    
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,足以滿足更新所用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/vice/p/8659817.html

延伸 · 閱讀

精彩推薦
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
主站蜘蛛池模板: 亚洲小视频在线 | 日韩欧美中文字幕一区二区三区 | 亚裔aⅴ艳星katsuni | 我们中文在线观看免费完整版 | 99热国产这里只有精品99 | 黄网在线观看免费网站台湾swag | 美女被视频网站 | 欧美在线欧美 | 国产小视频在线播放 | 色中色软件| 高h肉爽文农民工 | 国产精品久久免费 | www.麻豆视频 | 亚洲成人mv | 九九99九九精彩 | 男男18视频免费网站 | 欧美摸胸 | 国产精品一区久久精品 | 四虎黄色影视库 | 国产色司机在线视频免费观看 | 成人高清视频在线观看 | 欧美kkk4444在线观看 | 国产成人精品一区二区 | 特级毛片免费视频观看 | 欧美日韩高清一区 | 国产伦精品一区二区三区免费观看 | 婷婷丁香色综合狠狠色 | 亚洲成人免费看 | 蜜桃免费 | 很黄的网站在线观看 | 天天操丝袜 | 日韩在线免费播放 | 四虎国产 | 国产亚洲精品一区二区在线观看 | 天天干天天日天天射天天操毛片 | 天天干夜夜噜 | 国产草| 久久视频在线视频观看天天看视频 | 思久久 | 7788理论片在线观看 | 国产免费午夜高清 |