分享一个客户端程序(winform)自动升级程序,思路+…
2018-06-17 21:13:52来源:未知 阅读 ()
做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,配置及使用看起来很成熟全面.
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“函数(2)” 2019-08-13
- Python3字典排序 2019-07-24
- 用python写一个简单的文件上传 2019-07-24
- tcp服务端无线为多个客户端服务 2019-07-24
- Python random模块(以后用到一个再更新一个) 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash