做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,配置及使用看起来很成熟全面.

分享一个客户端程序(winform)自动升级程序,思路+说明+源码的更多相关文章

  1. c# winform 自动升级

    winform自动升级程序示例源码下载  客户端思路: 1.新建一个配置文件Update.ini,用来存放软件的客户端版本: [update] version=2011-09-09 15:26 2.新 ...

  2. SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...

  3. c/s程序版本自动升级的问题,如何判断client端版本号是否最新,然后从指定ftp服务器down

    c/s程序版本自动升级的问题,如何判断client端版本号是否最新,然后从指定ftp服务器down http://blog.csdn.net/delphizhou/article/details/30 ...

  4. 分享一个超级好用的php程序员工具箱

    分享一个超级好用的php程序员工具箱,是由php中文网开发的. 集合了php环境搭建.在线小工具.原生手册.文字与视频教程.问答社区等 (php程序员工具箱 v0.1版本,点此下载:http://ww ...

  5. C/S WinForm自动升级

    这二天刚好完成一个C/S 自动升级的功能 代码分享一下 /// <summary>    /// 版本检测    /// </summary>    public class ...

  6. winform 自动升级

    自动升级系统OAUS的设计与实现(续) (附最新源码) http://www.cnblogs.com/zhuweisky/p/4209058.html Winform在线更新 http://www.c ...

  7. 微信小程序——智能小秘“遥知之”源码分享(语义理解基于olami)

    微信小程序智能生活小秘书开发详解 >>>>>>>>>>>>>>>>>>>>> ...

  8. Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战

    Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品 ...

  9. c# winform 中的 工具栏自动隐藏 splitter用法 带源码

    c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313

随机推荐

  1. Android配置时,点击eclipse里Window->Preferences里的android选项出错

    An error has occurred when creating this preference page. 解决方法:重起eclipse

  2. 分享一些Comet开发经验

    前言 本comet技术主要用于数据库持久层的 穿越防火墙 远程访问.只要有一台中继网站,任意地点的数据库都能被访问. Comet概念介绍 WebIM.网页的客服.meebo等大家听说过了.最近还有个兄 ...

  3. asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度

    介绍 使用许多小得JS.CSS文件代替一个庞大的JS或CSS文件来让代码获得更好的可维 护性,这是一个很好的实践.但这样做反过来却损失了网站的性能.虽然你应该将你的Javascript代码写在小文件中 ...

  4. LR录制测试脚本

    1.录制的业务流程 2.录制脚本 3.查看脚本

  5. 创建优雅表格的8个js工具

    当需要呈现数百个表的数据时,展示和可访问性扮演着至关重要的角色.在这种情况下,倘若一个数据网格能够支持大量数据集的HTML Table并提供诸如排序.搜索.过滤和分页等功能,那是棒棒哒.在这篇文章中, ...

  6. 基于OSGI.Net的图形界面系统

    在2013年的十月份有幸接触了osgi.net和iopenworks的创始人,了解和学习的插件式开发,开始了后台数据的处理生涯. 第一个有图形界面的系统——智能农业的环境监测系统,其实在这个系统中所有 ...

  7. bzoj 2190 [SDOI2008]仪仗队(欧拉函数)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2190 [题意] n*n的正方形,在(0,0)格点可以看到的格子数目. [思路] 预处理 ...

  8. WinDriver&PCIE

    1.安装VS2012 安装VS2012略过,主要用它来做数据传输应用程序的,WINDRIVER提供了一系列API接口,方便了用户,使用户能直接进入用户态的编程,因为内核态的编程它已做好,不需要进行修改 ...

  9. FILETIME, SYSTEMTIME 与 time_t 相互转换

    FILETIME, SYSTEMTIME 与 time_t 相互转换 2009-08-24 15:37:14|  分类: 默认分类|举报|字号 订阅     //******************* ...

  10. Ajax禁止缓存的几个解决方案

    最常用的方法是 方法1:服务器端代码加入  代码如下 复制代码 response.setHeader("Cache-Control", "no-cache, must-r ...