实现一个简易的自动升级工具

在保持某XX系统不做改动的情况下,加入自动更行功能。

考虑使用外部程序作为启动器,先检测版本执行更新,再去launch某XX系统的主程序。并且要支持某XX系统主动运行该自动更新工具也可以完成更新。

简单介绍一下自动升级要做的事:

注:适用于支持部分文件升级的系统。

1.服务端提供文件下载服务,提供加密后的自动更新文件清单内容。

2.客户端获取自动更新文件清单,并解密内容,比对主版本,比对文件MD5,关闭主程序,下载需要的文件,覆盖文件到最新版本,重启主程序。

服务端清单文件配置工具,生成清单文件:

清单文件部分内容经过DES加密再存储。

/// <summary>/// 清单文件 读取并解析XML到对象(C#客户端解析XML可参照此处)/// </summary>/// <param name="modelData"></param>/// <param name="filePath"></param>private void ReadAutoUpdateMapsXml(UptBaseModel modelData, string filePath){if (!File.Exists(filePath)) return;var tempModel = XmlHelper.Deserialize<UptBaseModel>(File.ReadAllText(filePath));if (tempModel != null){modelData.version = tempModel.version;modelData.description = tempModel.description;modelData.server = EncryptParse.DESDecrypt(tempModel.server ?? "", EncryptParse.GenerateDESKey(tempModel.version ?? ""));if (tempModel.files != null && tempModel.files.Count > 0){modelData.count = tempModel.files.Count;foreach (var item in tempModel.files){//DES解密信息item.fileName = EncryptParse.DESDecrypt(item.fileName ?? "", EncryptParse.GenerateDESKey(item.hash1));item.filePath = EncryptParse.DESDecrypt(item.filePath ?? "", EncryptParse.GenerateDESKey(item.hash1));item.fileDrect = EncryptParse.DESDecrypt(item.fileDrect ?? "", EncryptParse.GenerateDESKey(item.hash1));item.urlDrect = EncryptParse.DESDecrypt(item.urlDrect ?? "", EncryptParse.GenerateDESKey(item.hash1));}modelData.files.Clear();modelData.files.AddRange(tempModel.files);}}else{modelData.version = "1.0.0.0";modelData.description = "";modelData.files.Clear();}}/// <summary>/// 清单文件 加密并保存内容到XML /// </summary>/// <param name="modelData"></param>/// <param name="toPath"></param>private void SaveAutoUpdateMapsXml(UptBaseModel modelData, string toPath){var tempModel = new UptBaseModel();tempModel.version = modelData.version;tempModel.description = modelData.description;tempModel.server = EncryptParse.DESEncrypt(modelData.server ?? "", EncryptParse.GenerateDESKey(modelData.version ?? ""));foreach (var item in modelData.files){var info = new FileInfoModel();info.hash1 = item.hash1;info.fileVer = item.fileVer;info.fileBytes = item.fileBytes;info.lastWTime = item.lastWTime;//DES加密信息info.fileName = EncryptParse.DESEncrypt(item.fileName ?? "", EncryptParse.GenerateDESKey(item.hash1));info.filePath = EncryptParse.DESEncrypt(item.filePath ?? "", EncryptParse.GenerateDESKey(item.hash1));info.fileDrect = EncryptParse.DESEncrypt(item.fileDrect ?? "", EncryptParse.GenerateDESKey(item.hash1));info.urlDrect = EncryptParse.DESEncrypt(item.urlDrect ?? "", EncryptParse.GenerateDESKey(item.hash1));tempModel.files.Add(info);}XmlDocument xmlDoc = new XmlDocument();xmlDoc.LoadXml(XmlHelper.Serialize(tempModel, true, true));xmlDoc.Save(toPath);}

客户端自动更新程序,获取清单内容、下载文件:

这里直接使用http下载清单文件。

下载步骤:获取清单文件,通过DES解密内容,获得最新文件下载链接及目标路径,再比对MD5并下载到临时文件夹。

更新步骤:关闭待更新应用主程序,覆盖临时文件夹中的文件到应用程序目录,删除临时文件夹,重启应用主程序。

/// <summary>/// 获取清单文件链接地址/// </summary>/// <param name="serverUrl">文件父目录</param>/// <param name="arrgs">命令参数</param>/// <returns></returns>public static string GetAutoUpdateMapsXmlServerUrl(string serverUrl, string[] arrgs){serverUrl = Common.ServerUrl;var fileUrl = serverUrl + "/" + _AutoUpdateMapsXmlName;if (arrgs != null && arrgs.Length > 0){//var url = _arrgs.Where(x => x.ToLower().StartsWith("http:")).FirstOrDefault();var url = string.Empty;foreach (var v in arrgs){if (v.ToLower().StartsWith("http:", StringComparison.OrdinalIgnoreCase)) url = v;if (v.ToLower().StartsWith("https:", StringComparison.OrdinalIgnoreCase)) url = v;}if (string.IsNullOrEmpty(url) == false){serverUrl = url;fileUrl = serverUrl + "/" + _AutoUpdateMapsXmlName;}if (url?.ToLower().LastIndexOf(".xml") > 0){fileUrl = url;}}return new Uri(fileUrl).ToString();}///<summary>/// HTTP读取文件文本内容/// </summary>/// <param name="fileUrl">文件链接地址</param>public static string DownloadAutoUpdateMapsXmlText(string fileUrl){HttpWebRequest resq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(fileUrl);HttpWebResponse resp = (System.Net.HttpWebResponse)resq.GetResponse();//判断服务器未响应if (resp.StatusCode != HttpStatusCode.OK){throw new Exception("文件内容地址响应失败");}Stream st = resp.GetResponseStream();Encoding encode = System.Text.Encoding.GetEncoding("utf-8");StreamReader reader = new StreamReader(st, encode);return reader.ReadToEnd();}/// <summary>/// 读取并解析XML到对象/// </summary>/// <param name="targetXml"></param>public static UptBaseModel ReadAutoUpdateMapsXml(string targetXml){UptBaseModel modelData = new UptBaseModel();if (string.IsNullOrEmpty(targetXml)) return modelData;var tempModel = XmlHelper.Deserialize<UptBaseModel>(targetXml);if (tempModel != null){modelData.version = tempModel.version;modelData.description = tempModel.description;//modelData.server = EncryptParse.DESDecrypt(tempModel.server ?? "", EncryptParse.GenerateDESKey(tempModel.version ?? ""));if (tempModel.files != null && tempModel.files.Count > 0){modelData.count = tempModel.files.Count;foreach (var item in tempModel.files){//DES解密信息item.fileName = EncryptParse.DESDecrypt(item.fileName, EncryptParse.GenerateDESKey(item.hash1));item.filePath = EncryptParse.DESDecrypt(item.filePath, EncryptParse.GenerateDESKey(item.hash1));item.fileDrect = EncryptParse.DESDecrypt(item.fileDrect, EncryptParse.GenerateDESKey(item.hash1));item.urlDrect = EncryptParse.DESDecrypt(item.urlDrect ?? "", EncryptParse.GenerateDESKey(item.hash1));}modelData.files.Clear();modelData.files.AddRange(tempModel.files);}}else{modelData.version = "1.0.0.0";modelData.description = "";modelData.files.Clear();}return modelData;}/// <summary>/// 创建下载任务/// </summary>/// <param name="modelBase"></param>/// <param name="tempPath"></param>/// <param name="downloadProgressChangedEventHandler"></param>/// <param name="asyncCompletedEventHandler"></param>public static int CreatDownloadTasks(UptBaseModel modelBase, string tempPath, DownloadProgressChangedEventHandler downloadProgressChangedEventHandler = null, AsyncCompletedEventHandler asyncCompletedEventHandler = null){if (modelBase != null && modelBase.files != null && modelBase.files.Count > 0){if (string.IsNullOrEmpty(tempPath)) tempPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "patch"); //默认文件缓存路径//缓存目录文件夹不存在则创建if (Directory.Exists(tempPath) == false){Directory.CreateDirectory(tempPath);}foreach (var item in modelBase.files){var toPath = Path.Combine(tempPath, item.fileDrect);//目标文件夹不存在则创建if (Directory.Exists(Path.GetDirectoryName(toPath)) == false){Directory.CreateDirectory(Path.GetDirectoryName(toPath));}//比对文件MD5码if (File.Exists(toPath)){var nowHash = EncryptParse.GetFileMD5Hash(toPath);if (nowHash == item.hash1) continue;}item.targetPath = toPath;//开始创建连接下载WebClient client = new WebClient();if (downloadProgressChangedEventHandler != null) client.DownloadProgressChanged += downloadProgressChangedEventHandler;if (asyncCompletedEventHandler != null) client.DownloadFileCompleted += asyncCompletedEventHandler;client.DownloadFileAsync(new Uri(item.urlDrect), toPath, item);modelBase.updateCount++;}}return modelBase.updateCount;}

效果图:

清单配置工具:

自动更新程序:

源代码奉上:

AutoUpdater.rar

AutoUpdater 实现一个简易的自动升级工具相关推荐

  1. 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具

    查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...

  2. ESP8266 + MAX7219 做一个简易的自动同步的倒计时时钟

    ESP8266 + MAX 7219 简易的自动同步的倒计时时钟 正好最近有大事情想需要倒计时 然后翻遍了家里的犄角旮旯,发现还有个很古老的 ESP8266 还闲置着 所以就拿过来用了 引脚接法 其实 ...

  3. 如何将asp.net MVC2项目升级为MVC3项目(微软官方自动升级工具:ASP.NET MVC 3 Application Upgrader )...

    微软最近发布了一个自动工具来完成这个复杂的升级工作,但这个工具本身很难找到,被baidu/google中众多讨论手工升级的文章压在底下.偶然找到特此与大家分享: ASP.NET MVC 3 Appli ...

  4. python自动抢购dmall_一个简易的自动抢购脚本

    两年前的中秋节,阿里巴巴四个程序员编写了段网页脚本,抢了公司一百多盒月饼而惨遭辞退.有人说阿里小题大做,有人说诚信第一,那时我在想他们是如何做到的呢?上个月,二组群里讨论Python编程,我忽然想起了 ...

  5. python温度转换_一步一步教会你,详解用Python实现一个简易的温度换算GUI小工具...

    今天,我们来使用Python完成一个小工具的制作.很简单,就是对于摄氏温度和华氏温度的相互换算.但是,我们的目的是复习一下之前学过的Python中tkinter的小内容. 复习下前面的知识 先来看下今 ...

  6. Android 一s个相对完整的自动升级功能实现代码

    由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...

  7. OAUS自动升级系统

    http://www.cnblogs.com/zhuweisky/p/3927224.html#3102248 没想到实现一个软件的自动升级变得如此简单.这就是有头脑的表现. 过程:软件发布者在自己电 ...

  8. PNG字幕文件自动生成工具

    最近在PR中做视频需要加字幕,虽然有很多字幕工具,但是个人不喜欢用. 用PS做大段的文字又太费时,所以写了一个字幕文件自动生成工具,其实就是自动批量输出透明的PNG文件.

  9. 非常好用的在线画树网站(树结构的自动生成工具,免去手动画树的烦恼)

    最近编译原理学到语法分析树,需要频繁.大量地画树结构,一开始我使用了画图.PPT等工具,或是在纸上画好然后拍下来,但很是麻烦. 经同学推荐,找到了这样一个树的自动生成工具:Syntax Tree Ge ...

  10. 软件自动升级系统:支持exe程序覆盖更新、目录结构、更新更新程序自身、更新sql、执行bat批处理...

    软件自动升级系统说明 目录 一.         自动升级需要需要实现些什么?... 1 二.         服务器安装... 2 三.         客户端配置... 4 四.         ...

最新文章

  1. 2021年大数据Spark(五):大环境搭建本地模式 Local
  2. Linux多台服务器共用密钥ssh自动登陆
  3. java 时间的封装类
  4. 5.6 Spring与Struts 2整合应用
  5. 获取计算机软件列表,获取计算机已安装软件列表解决方法
  6. BitNami Redmine Stack
  7. 工作101:列表村放在tabledata找父组件取值
  8. 春晚亲民,快手上行:探秘春晚红包的另一种打开方式
  9. 一个具有20位地址和32位字长的存储器_详解西门子间接寻址之存储器间接寻址...
  10. Java开发中常用的设计模式-单例模式
  11. Linux 重启命令
  12. java基础--名词解释汇总
  13. 信息隐藏 !!!!!!!!!!!!!
  14. 论文浅尝 | ERNIE-ViL:从场景图中获取结构化知识来学习视觉语言联合表示
  15. Kvaser Memorator Pro 2xHS v2
  16. 向Facebook学什么
  17. python中用BBP公式计算π
  18. 腾讯云服务器维护中,服务器|腾讯云服务器的配置指南
  19. cad自定义菜单cui_cad cui文件下载
  20. PDF转PPT文档软件PDF to PowerPoint Mac

热门文章

  1. S MT 精密电阻 对照 表
  2. c语言日历程序实验报告,万年历实验报告.doc
  3. 【学习OpenCV4】OpenCV4入门介绍
  4. CSS基础--属性设置
  5. 八数码问题简单解决办法
  6. ad10搜索快捷键_AD中常用的快捷方式
  7. tensorflow实现深度可分离卷积
  8. 重启计算机恢复出厂设置,windows7电脑恢复出厂设置的三种方法
  9. 深度探索C++对象模型电子书pdf下载
  10. saas平台产品使用合同(模板)