C#实现在线更新系统
先来看一下程序完成后长什么样。

这个是程序的组成部分。

主要功能是在InitializationUpdate这个类中完成的,From1主要起到调用的作用,所以重心还是在InitializationUpdate这个类上,下面我们来看一下这个类完成了什么工作,都是如何完成的。
先调用两个类:
//使用WebClient下载
public WebClient client = new WebClient();
待会儿下载更新文件要用到
还有几个全局变量
//当前版本
public string localversion = null;
//最新版本
public string latesversion = null;
//主窗体
public Form1 form;
//通知内容
public string nnidtext = null;
//获取本地版本号
public void NowVersion()
{
System.Diagnostics.FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo("新云翻译器.exe");
localversion = fv.FileVersion;
}
这个方法帮我们拿到目前软件的版本,因为我们要拿到的版本号是我们要更新的软件的版本号,而不是本软件的版本号,这里需要注意下,别搞错了。
/// <summary>
/// 从服务器上获取最新的版本号
/// </summary>
public void DownloadCheckUpdateXml()
{
try
{
//第一个参数是文件的地址,第二个参数是文件保存的路径文件名
client.DownloadFile(http://cloudyours.net/Software//Update/NewcloudTranslator/NewcloudTranslator221210.XML, @"Update\NewcloudTranslator221210.XML");
}
catch
{
nnidtext = "没有检测到更新";
Environment.Exit(0);
}
}
我们用这个方法从服务器上拿到最新的软件版本,之后会进行对比。
/// <summary>
/// 读取从服务器获取的最新版本号
/// </summary>
public void LatestVersion()
{
if (File.Exists(@"Update\NewcloudTranslator221210.XML"))
{
XmlDocument doc = new XmlDocument();
//加载要读取的XML
doc.Load(@"Update\NewcloudTranslator221210.XML");
//获得根节点
XmlElement WriteBook = doc.DocumentElement;
//获得子节点 返回节点的集合
XmlNodeList Update = WriteBook.ChildNodes;
foreach (XmlNode item in Update)
{
latesversion = item.InnerText;
}
}
else if (!File.Exists(@"Update\NewcloudTranslator221210.XML"))
{
nnidtext = "检查更新失败";
Environment.Exit(0);
}
}
这个方法就是用来读取我们拿到的文档,然后存储一下,后面会用到。
/// <summary>
/// 下载安装包
/// </summary>
public void DownloadInstall()
{
if (localversion == latesversion)
{
nnidtext = "恭喜你,已经更新到最新版本";
}
else if (localversion != latesversion && File.Exists(@"Update\NewcloudTranslator221210.XML"))
{
nnidtext = "发现新版本,即将下载更新补丁";
client.DownloadFile("http://cloudtours.net/Software//Update/NewcloudTranslator/NewCloudTranslator2_2_1_210_Setup.exe", @"Update\NewCloudTranslator2_2_1_210_Setup.exe");
if (File.Exists(@"Update\NewCloudTranslator2_2_1_210_Setup.exe"))
{
InstallandDelete();//这里调用安装的类
}
else if (!File.Exists(@"Update\NewCloudTranslator2_2_1_210_Setup.exe"))
{
//如果一次没有下载成功,则检查三次
for (int i = 1; i < 3; i++)
{
client.DownloadFile("http://cloudtours.net/Software//Update/NewcloudTranslator/NewCloudTranslator2_2_1_210_Setup.exe", @"Update\NewCloudTranslator2_2_1_210_Setup.exe");
}
nnidtext = "下载失败,请检查您的网络连接是否正常";
Environment.Exit(0);
}
}
}
这个方法是用来下载安装包的,先对比一下我们读取到的最新版本号和本地版本号,如果一样就不用下载安装包,如果不一样就下载更新。
/// <summary>
/// 安装及删除
/// </summary>
private void InstallandDelete()
{
//安装前关闭正在运行的程序
KillProgram();
//启动安装程序
Process.Start(@"Update\NewCloudTranslator2_2_1_210_Setup.exe");
JudgeInstall();
}
这个方法就简单了,就打开一下我们的安装包,之后调用几个其他方法,其他方法会在下面附上。
/// <summary>
/// 判断安装进程是否存在
/// </summary>
public void JudgeInstall()
{
Process[] processList = Process.GetProcesses();
foreach (Process process in processList)
{
if (process.ProcessName == "NewCloudTranslator2_2_1_210_Setup.exe")
{
process.Kill();
File.Delete(@"Update\NewCloudTranslator2_2_1_210_Setup.exe");
File.Delete(@"Update\NewcloudTranslator221210.XML");
}
else
{
File.Delete(@"Update\NewCloudTranslator2_2_1_210_Setup.exe");
File.Delete(@"Update\NewcloudTranslator221210.XML");
return;
}
}
}
这个方法就完成了简单的删除更新文件的。
/// <summary>
/// 结束程序
/// </summary>
public void KillProgram()
{
Process[] processList = Process.GetProcesses();
foreach (Process process in processList)
{
//如果程序启动了,则杀死
if (process.ProcessName == "新云翻译器.exe")
{
process.Kill();
}
}
}
有几个方法中用到了这个方法,并没有什么技术含量。
到这里就结束了,这个程序就算做完了,其实蛮简单的,就看你没有想到这点。
注:转载请注明出处:http://www.cnblogs.com/skylgmg/p/4792990.html
C#实现在线更新系统的更多相关文章
- 手机在线更新系统MySQL数据库服务器参数优化mycnf,16G内存8核CPU,
业务场景: 后台支持手机在线更新系统,db服务器内存16G,8核,dell的pc服务器. qps: 200个左右 tps: 1个左右 一分钟50几个 sort_buffer_size = 32M 大了 ...
- iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)
iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...
- linux运维中的命令梳理(一)
在linux日常运维中,我们平时会用到很多常规的操作命令. 下面对常用命令进行梳理: 命令行日常系快捷键(不分大小写)CTRL + A 移动光标到行首CTRL + E 移动光标到行末CTRL + U ...
- windows server system32下常见快捷指令
win+R 命令行窗口 cmd dos命令窗口 mstsc 远程登录输入窗口 calc 快速打卡计算器 control 打开控制面板 eve ...
- Linux运维笔记-日常操作命令总结(1)
在linux日常运维中,我们平时会用到很多常规的操作命令. 查看服务器的外网ip [root@redis-new01 ~]# curl ifconfig.me [root@redis-new01 ~] ...
- CentOS显示设置时间命令- date
概要: date命令的功能是显示和设置系统日期和时间 命令格式: date [OPTION]... [+FORMAT]date [-u|--utc|--universal] [MMDDhhmm[[CC ...
- system32下 exe文件作用
system32下EXE文件的作用说明 A accwiz.exe 辅助功能向导 ahui.exe 应用程序兼容用户界面 alg.exe 为 Internet 连接共享和 Internet 连接防火墙提 ...
- MySQL数据库服务器参数优化mycnf,16G内存8核CPU,
业务场景: 后台支持手机在线更新系统,db服务器内存16G,8核,dell的pc服务器. qps: 200个左右 tps: 1个左右 一分钟50几个 sort_buffer_size = 32M 大了 ...
- [转]Jetson TX1 开发教程(1)配置与刷机
开箱 Jetson TX1是英伟达公司新出的GPU开发板,拥有世界上先进的嵌入式视觉计算系统,提供高性能.新技术和极佳的开发平台.在进行配置和刷机工作之前,先来一张全家福: 可以看到,Jetson T ...
随机推荐
- 简单的批量读取外部insert文并插入DB
package com.tongxiang.item.base.dao; import java.io.BufferedReader; import java.io.File; import java ...
- Codeforces round #353div2 C
题目来源:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=117863#problem/C 题目大意:给你n个数字,代表这个人在n个银行里面 ...
- 慕课linux学习笔记(六)常用命令(3)
Find 命令 #搜索文件 Find [搜索范围] [搜索条件] e.g. find / -name isnstall.log 搜索速度会非常慢 避免大范围搜索,会非常耗费系统资源 Find是在系统当 ...
- :before与:after伪类的应用
1.小三角样式
- Broadcom网卡linux系统下无法连接到网络问题(某种情况- -||)的解决办法
国际惯例,先闲扯: 其实我是个电脑白痴,至于为什么一个电脑白痴会来做开发呢?原因非常匪夷所思且简单--“因为做开发看起来很酷!”,那为什么要一把年纪了才来做开发呢?原因更简单,“当我回过神,就发现我已 ...
- 什么是dtd文件,为什么需要dtd
DTD为英文Document Type Definition,中文意思为"文档类定义".DTD肩负着两重任务:一方面它帮助你编写合法的代码,另一方面它让浏览器正确地显示器代码.也许 ...
- KEILC51可重入函数及模拟栈浅析
MARK:文章中的红色部分是个人的理解. KEILC51可重入函数及模拟栈浅析 关键字:keilc51,模拟堆栈,可重入函数调用,参数传递,C?XBP,C?ADDXBP 摘要:本文较详细的介绍了kei ...
- 关于sencha touch 的JSONP跨域请求的学习研究
此篇文章是对自己在研究学习sencha touch的过程中的点滴记录,主要是JSONP的跨域请求这方面,对于何为是跨域概念还有不熟悉的,可以自己问下度娘. 先上张图: 我要完成的功能就是表格下拉刷新, ...
- /etc/fstab 文件详解 及 /etc/mtab
/etc/fstab 文件解释 文件fstab包含了你的电脑上的存储设备及其文件系统的信息.它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件. 这个文件的全路径是/etc/fstab ...
- Search in Rotated Sorted Array (I, II) 解答
Question Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 ...