最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要。
在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜欢此方案,觉得太麻烦,然后自己初步琢磨了一下如下方案。
现在比较喜欢的编程方式,先画图。
<>强软件更新流程强>
<>强安装包的制作强>
为了简单,采用了自解压压缩包的方式制作更新包,将整个新程序包打包为一个自解压压缩包。
以下是我的自解压包的参数设置,怎样制作自解压包网上有很多教程,可以自己去搜索。
常规——解压路径:“c: \ barcodeSys”
设置-解压后运行:“c: \ barcodeSys \ updateLog。txt”
模式:隐藏启动对话框。
高级:添加快捷方式到桌面
源文件:“c: \ barcodeSys \ BarcodeMain。exe”
快捷方式名:条码扫描程序
更新:解压替换,覆盖所有。
<>强制作更新程序强>
因为软件在更新时更新程序是一直在运行的,这样在自解压包解压时就会无法替换更新程序,所以将更新程序作为一个单独的窗体程序来做,由主程序启动时调用。
制作更新程序前,首先解决怎样判断是否存在最新版本的问题,我采用FTP服务器上新建一个文本文档名称为SvrVer.txt,内容为最新版本号,本地程序文件夹中建立一个文本文档名称为版本,内容为本地程序版本号。方法检查服务器版本号是否与本地版本一致,如果一致则表示不需要更新,否则相反,如下图
以下为更新程序下载文件部分的代码
长文件大?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协议的简易软件自动升级程序