软件更新设计思路
更新文件方法
在确定存在新版本以后,下一步就是更新本地文件。方法同样也很多,就只说我自己的思路吧。
更新程序和主程序分离,为两个独立的EXE,更新在主程序根目录下的一个文件夹内。在主程序打开更新程序验证完更新信息开始下载以后,首先关闭主程序,然后遍历根目录下所有文件,遇到文件便删除,遇到文件夹不做任何操作(建立文件夹存放更新程序的原因),然后便从远程地址下载程序压缩包到更新文件夹,解压到主程序根目录,删除压缩包,最后退出更新程序打开主程序(当然不是最开始的那个主程序了)。
这就是全部思路,梳理完后你会发现其实实现更新功能很简单。
实现代码
我只给关键的代码,也不会说该放哪些控件。本文中所有代码均在SuperBuster项目中。
判断更新
//此处自定义函数HttpGet
public static string HttpGet(string url)
{
Encoding encoding = Encoding.UTF8;//编码方式,此处为UTF-8
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//创建Http请求
request.Method = "GET";//请求方法,此处为GET
request.Accept = "text/html, application/xhtml+xml, */*";//媒体类型
request.ContentType = "application/json";//JSON数据格式
request.Timeout = 20000;//超时时间,以毫秒为单位
HttpWebResponse response = (HttpWebResponse)request.GetResponse();//发送请求
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();//返回数据
}
}
全局变量Version(字符串)为当前程序版本。获取文件内容,将html文件中的版本号用全局变量b(字符串)储存,通过两变量对比判断更新。
try
{
button1.Enabled = false;
label1.Text = "正在检查更新......";
b = HttpGet("http://www.loyingxi.eu.org/AppVersion.html");
if (b != Version)
{
MessageBox.Show("发现新版本!最新版本为:" + b, "提示");
button1.Enabled = true;
button2.Enabled = true;
}
else
{
MessageBox.Show("当前为最新版本!", "提示");
button1.Enabled = true;
}
}
catch
{
MessageBox.Show("未知错误!", "提示");
button1.Enabled = true;
}
删除旧版本文件
首先获取父目录,因为更新程序在主程序根目录下的子目录中。然后遍历所有文件以及目录。因为项目中只有一个文件夹(存放更新程序),所以遇到目录不处理就好,遇到文件便删除。不同项目设计不同,如果你的项目中根目录下的目录不止更新目录一个,那么就要费点心重新想重新写了(当然还有很多种方法)。
DirectoryInfo info = new DirectoryInfo(Application.StartupPath);
string a = info.Parent.FullName;
DirectoryInfo dir = new DirectoryInfo(a);
FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();
foreach (FileSystemInfo i in fileinfo)
{
if (i is DirectoryInfo)
{
}
else
{
File.Delete(i.FullName);
}
}
下载新版本压缩包
下载文件本来是很复杂的操作,要写很多代码,但是WebClient类让下载变得非常轻松。通过WebClient把新版本压缩包下载保存到更新程序所在的目录。
WebClient webClient = new WebClient();
webClient.DownloadFile(new Uri("http://www.loyingxi.eu.org/files/App.zip"), "Latest.zip");
解压压缩包
通过ZipFile类,解压文件到原来的主程序根目录下,然后删除压缩包。
ZipFile.ExtractToDirectory(Directory.GetCurrentDirectory() + "/Latest.zip", a);
File.Delete("Latest.zip");
更新功能到此就完成了,非常的简单。当然这个例子中仍然有很多不足的地方,比如如果主程序根目录下不止一个子目录,要增加额外的判断或者换思路,没有备份,如果更新失败如中途退出,那么删除的文件无法恢复等等。大家可以自己完善!