1. //这是一个webservice
  2.  
  3. private AppUpdate.UpdateServ UpdateSvr;
  4.  
  5. private void button1_Click(object sender, System.EventArgs e)
  6. {
  7.  
  8. if(LinkWebServices()==true)
  9. {
  10. this.label1.Text="连接服务器....... PASS";
  11.  
  12. if(CheckVer()==true)
  13. {
  14. this.label2.Text="检查最新版本并下载.......PASS";
  15.  
  16. }
  17. else
  18. {
  19. this.label2.Text="检查最新版本并下载.......FAIL";
  20. }
  21. }
  22. else
  23. {
  24. this.label1.Text="连接服务器.......FAIL";
  25. }
  26. }
  27.  
  28. //这是用来与升级服务器建立连接
  29. private bool LinkWebServices()
  30. {
  31. try
  32. {
  33. UpdateSvr=new UpdateServ();
  34. return true;
  35. }
  36. catch
  37. {
  38. return false;
  39. }
  40. }
  41.  
  42. //调用webservice用来检查是不是有最新的版本
  43. private bool CheckVer()
  44. {
  45. string path =Application.StartupPath;
  46. try
  47. {
  48. VersionCheck(path);
  49. return true;
  50. }
  51. catch(Exception ex)
  52. {
  53. MessageBox.Show(ex.ToString());
  54. return false;
  55. }
  56. }
  57.  
  58. private void VersionCheck(string desPath)
  59. {
  60. try
  61. {
  62. #region 查看文件和目录
  63. if(!desPath.EndsWith(@"\"))
  64. desPath += @"\";
  65.  
  66. if(!System.IO.Directory.Exists(desPath))
  67. {
  68. System.IO.Directory.CreateDirectory(desPath);
  69. }
  70.  
  71. string tempPath = desPath + @"tempDesPathCache\";
  72.  
  73. if(System.IO.Directory.Exists(tempPath))
  74. {
  75. System.IO.Directory.Delete(tempPath,true);
  76. System.IO.Directory.CreateDirectory(tempPath);
  77. }
  78. else
  79. System.IO.Directory.CreateDirectory(tempPath);
  80.  
  81. if(!System.IO.File.Exists(desPath + "UpdateConfig.xml"))
  82. {
  83. System.Xml.XmlDocument updateConfig = new System.Xml.XmlDocument();
  84. updateConfig.LoadXml(@"<root></root>");
  85. updateConfig.Save(desPath + "UpdateConfig.xml");
  86. }
  87. #endregion
  88.  
  89. System.Xml.XmlDocument serverXmlDoc = UpdateSvr.AppUpdateVertion();
  90. System.Xml.XmlDocument localXmlDoc = new System.Xml.XmlDocument();
  91. localXmlDoc.Load(desPath + "UpdateConfig.xml");
  92. bool newVersionExist = false;
  93. bool moduleExist = false;
  94. System.Xml.XmlNode serverNode0 = serverXmlDoc.ChildNodes[];
  95. System.Xml.XmlNode localNode0 = localXmlDoc.ChildNodes[];
  96. foreach(System.Xml.XmlNode serverNode in serverNode0)
  97. {
  98. moduleExist = false;
  99. foreach(System.Xml.XmlNode localNode in localNode0)
  100. {
  101. //找到对应模块
  102. if(localNode.ChildNodes[].InnerText == serverNode.ChildNodes[].InnerText)
  103. {
  104. moduleExist = true;
  105. //版本号判断
  106. if(localNode.ChildNodes[].InnerText.CompareTo(serverNode.ChildNodes[].InnerText) < )
  107. {
  108. newVersionExist = true;
  109. if(System.Configuration.ConfigurationSettings.AppSettings["NetStyle"].ToString()=="internet")
  110. {
  111. DownloadFile(serverNode.ChildNodes[].InnerText,tempPath + serverNode.ChildNodes[].InnerText);
  112. }
  113. else
  114. {
  115. DownloadFile(serverNode.ChildNodes[].InnerText,tempPath + serverNode.ChildNodes[].InnerText);
  116. }
  117. }
  118. break;
  119. }
  120. }
  121. //没找到对应模块
  122. if(false == moduleExist)
  123. {
  124.  
  125. if(System.Configuration.ConfigurationSettings.AppSettings["NetStyle"].ToString()=="internet")
  126. {
  127. DownloadFile(serverNode.ChildNodes[].InnerText,tempPath + serverNode.ChildNodes[].InnerText);
  128. }
  129. else
  130. {
  131. DownloadFile(serverNode.ChildNodes[].InnerText,tempPath + serverNode.ChildNodes[].InnerText);
  132. }
  133. }
  134. }
  135. //写入新UpdateConfig.xml升级完毕后替换
  136. if(newVersionExist)
  137. {
  138. serverXmlDoc.Save(tempPath + "UpdateConfig.xml");
  139. if(DialogResult.Yes == MessageBox.Show("有新版本,是否更新?","提示",MessageBoxButtons.YesNo))
  140. {
  141. string[] dirs = System.IO.Directory.GetFiles(tempPath, "*.*");
  142. string fileName;
  143. foreach (string dir in dirs)
  144. {
  145. fileName = ((dir.Split(Convert.ToChar(@"\")))[dir.Split(Convert.ToChar(@"\")).Length - ]);
  146. if(System.IO.File.Exists(desPath + fileName))
  147. {
  148. //TODO:可以支持备份以前版本
  149. System.IO.File.Delete(desPath + fileName);
  150. }
  151. //TODO:如果系统正在运行,您得停止系统,至于如何停止,也许可以使用System.Diagnostics.Process
  152. System.IO.File.Move(dir,desPath + fileName);
  153. }
  154. MessageBox.Show("升级完毕");
  155. }
  156. else
  157. {
  158. //TODO:可以支持重新提示升级
  159. }
  160. }
  161. }
  162. catch(Exception ex)
  163. {
  164. throw new Exception("升级失败,原因是:" + ex.Message,ex);
  165. }
  166. }
  167.  
  168. //下载最新的文件
  169.  
  170. private void DownloadFile(string source,string fileName)
  171. {
  172. try
  173. {
  174. System.Net.WebClient myWebClient = new System.Net.WebClient();
  175. myWebClient.DownloadFile(source,fileName);
  176. }
  177. catch(Exception ex)
  178. {
  179. throw new Exception("下载失败,原因是:" + ex.Message,ex);
  180. }
  181. }

C#制作在线升级程序的更多相关文章

  1. Encrypting bootloader (程序BIN文件加密及在线升级)

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...

  2. C#做的在线升级小程序

    转自原文C#做的在线升级小程序 日前收到一个小任务,要做一个通用的在线升级程序.更新的内容包括一些dll或exe或.配置文件.升级的大致流程是这样的,从服务器获取一个更新的配置文件,经过核对后如有新的 ...

  3. Encrypted bootloader (程序BIN文件加密及在线升级)

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...

  4. STM32 IAP 在线升级详解(转)

    源:http://blog.csdn.net/yx_l128125/article/details/12992773 (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP   ...

  5. PIC32MZ 通过USB在线升级 -- USB CDC bootloader

    了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...

  6. 【转载】STM32 IAP 在线升级详解

      (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...

  7. Java程序如何自动在线升级

    有时候我们的程序需要连接服务器检测新版本,如果发现新版本则需要自动下载升级.这种需求在Linux下还好说,但在windows下如何替换正在运行的程序文件呢? 当然有办法,步骤如下: 1. 将我们的程序 ...

  8. 微信小程序在线制作 自己制作微信小程序

    小程序是个什么东西?怎么自己制作微信小程序?微信小程序在线制作难吗?最近老是听这类问题,耳朵都长茧子了. 百牛信息技术bainiu.ltd整理发布于博客园 接下来作为一个技术人员的角度就为大家分析一下 ...

  9. ESA2GJK1DH1K升级篇: 快速的移植升级程序到自己的项目(BootLoader程序制作)

    前言 此代码兼容STM32F103全系列 为避免添加上升级程序造成内存不足,请使用128KB Flash及其以上的型号 这篇文章是为了能够让大家快速移植我的升级模板程序到自己的项目 BootLoade ...

随机推荐

  1. Oracle 课程八之性能优化之10046事件

    Oracle 的事件很多. 具体参考blog: Oracle 跟踪事件 set event 转摘:http://blog.csdn.net/tianlesoftware/archive/2009/12 ...

  2. Spring+iBatis+Atomikos实现JTA事务

    Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品. 产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransacti ...

  3. Android 模拟器中sdcard操作

    1.  在模拟器中创建sdcard目录,方法如下: 1. mksdcard命令 用cmd进入SDK的Tools目录,执行mksdcard命令.会出现如下帮助信息 我们可以看到sdcard image支 ...

  4. java 使用相对路径读取文件

    java 使用相对路径读取文件 1.java project环境,使用java.io用相对路径读取文件的例子: *目录结构:  DecisionTree            |___src      ...

  5. 对LR analysis的平均事务响应时间和summary中时间值不同的解释

    最近在做性能测试对LR结果分析时,又碰到了关于summary里与平均事务响应时间中各交易的响应时间值不同的问题.在此做个记录. 若交易中设置了思考时间,分析时需要注意查看是否过滤思考时间. 设置是否包 ...

  6. linux命令——磁盘命令mkdir

    一.介绍 mkdir 命令用于创建文件夹或目录(类似dos下的md命令),要求创建目录的用户在当前目录中具有写权限, 并且指定目录名不能是当前目录中已有的目录或文件名称.名称区分大小写. 二.用法及参 ...

  7. duilib combo控件,当鼠标滚动时下拉列表自动关闭的bug的修复

    转载请说明出处,谢谢~~ 群里有朋友提到了使用Combo控件时,当下拉列表出现,此时鼠标滚轮滚动,下拉列表就自动消失了.我看了一下源码,这个bug的修复很简单. CComboUI控件被单击时创建CCo ...

  8. linux下配置双网卡及RAC规划——1

    使用背景: 操作系统:centos 虚拟机:virtualbox RAC系统中需要双网卡,一个为公共的网络环境,一个为私有的网络环境,从而需要搭建双网络. 在菜单FILE中选择preferences, ...

  9. 基于Python的Grib数据可视化

    http://www.cnblogs.com/kallan/p/5160017.html

  10. 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)

    版权声明: 本文由LeftNotEasy所有,发布于http://leftnoteasy.cnblogs.com.如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任. 前言: ...