c#基于FTP协议的简易软件自动升级程序

  

最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要。

  

在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜欢此方案,觉得太麻烦,然后自己初步琢磨了一下如下方案。

  

现在比较喜欢的编程方式,先画图。

  

<>强软件更新流程

  

 C #基于FTP协议的简易软件自动升级程序

  

<>强安装包的制作

  

为了简单,采用了自解压压缩包的方式制作更新包,将整个新程序包打包为一个自解压压缩包。

  

以下是我的自解压包的参数设置,怎样制作自解压包网上有很多教程,可以自己去搜索。

  

常规——解压路径:“c: \ barcodeSys”
  设置-解压后运行:“c: \ barcodeSys \ updateLog。txt”
  模式:隐藏启动对话框。
  高级:添加快捷方式到桌面
  源文件:“c: \ barcodeSys \ BarcodeMain。exe”
  快捷方式名:条码扫描程序
  更新:解压替换,覆盖所有。

  

<>强制作更新程序

  

因为软件在更新时更新程序是一直在运行的,这样在自解压包解压时就会无法替换更新程序,所以将更新程序作为一个单独的窗体程序来做,由主程序启动时调用。

  

制作更新程序前,首先解决怎样判断是否存在最新版本的问题,我采用FTP服务器上新建一个文本文档名称为SvrVer.txt,内容为最新版本号,本地程序文件夹中建立一个文本文档名称为版本,内容为本地程序版本号。方法检查服务器版本号是否与本地版本一致,如果一致则表示不需要更新,否则相反,如下图

  

 C #基于FTP协议的简易软件自动升级程序

  

以下为更新程序下载文件部分的代码

  

        长文件大?helper.GetFileSize (dir + "/Release.exe ");//获得更新程序文件大小   文件大?文件大小;   如果(文件大小比;0)   {   updateLabelDelegate(“发现最新版本”+服务器+”!文件大小:“+文件大小+”字节”);//更新界面标签控件的委托   int readSize=0;   bool=false结果;   使用(fs=new FileStream文件流(“释放。exe”, FileMode.Create))   {   ftpAddress字符串url=" ftp://" + + " + dir +“/Release.exe”;   Console.WriteLine (url);=(FtpWebRequest) FtpWebRequest FtpWebRequest请求。新建(Uri (url));   请求。凭证=new NetworkCredential (ftpUserName ftpPassword);   请求。方法=WebRequestMethods.Ftp.DownloadFile;;   Console.WriteLine(请求);   请求。内容偏移=fs.Length;   updateLabelDelegate(“正在下载新版本…0字节/?文件大小+”字节”);   使用(FtpWebResponse响应=(FtpWebResponse) request.GetResponse ())   {   fs。位置=fs.Length;=new byte[]缓冲区字节(1024 * 2);   int数=response.GetResponseStream ()。读(缓冲区,0,buffer.Length);   而(计数比;0)   {   fs。写(缓冲区,0,数);   数=response.GetResponseStream ()。读(缓冲区,0,buffer.Length);   readSize +=计数;   双pa=(((双)readSize/(双)文件大小)* 100);   updateProgDelegate (pa) (int);//更新进度条的委托   UpdateUILabel(“正在下载更新…“+ (readSize) +”字节/?(文件大小)+”字节”);   Application.DoEvents ();   }   UpdateUILabel(“下载完成,正在安装新版本,请稍等……”+(文件大小)+”字节/?(文件大小)+”字节”);   updateProgDelegate (100);   .Close response.GetResponseStream () ();   }   }   过程p=Process.Start (“Release.exe”);//下载完成后调用自解压包   p.WaitForExit ();//等待自解压包解压完成         p.StartInfo。文件名=" BarcodeMain.exe”;//启动主程序   p.StartInfo。参数=案隆?//传递主启动程序的参数,以免启动主程序后再次启动更新程序   p.Start();//启动   this.Close ();//关闭更新程序窗口   之前      

主程序的部分小修改

  

因为每次启动时主程序时会调用更新程序,同时关闭自身进程以准备更新,所以需要在主程序里做一些小事情,否则陷入启动主程序——启动更新程序——启动主程序的就无限循环中了。

  

1,修改主程序入口主要方法,增加参数

        (STAThread)   静态void Main (string[]参数)//接受参数   {   Application.EnableVisualStyles ();   Application.SetCompatibleTextRenderingDefault(假);   应用程序。运行(新指数(arg));//传递给主程序窗体的构造函数   }   

c#基于FTP协议的简易软件自动升级程序