.NET实现之(自动更新
?.NET实现之(自动更新)2011-05-13 13:23 by 南京.王清培, 3005 visits, 网摘, 收藏, 编辑
文件中保存着当前本地的版本号、服务器的更新地址、宿主程序的名称,需要宿主的名称就能在更新的时候将宿主程序重进程中枚举出来然后关掉,这样就不影响我们更新了,当然也可以实现宿主程序不关闭的情况下更新,如果用到某些已经被宿主程序占用的情况会直接影响更新流程,所以以防万一关了为妙;
这是客户端版本文件中保存的信息;
我们上面说了,更新分为手动和自动,我们先来说手动更新吧,手动更新就是需要用户自己去点击更新按钮然后开始更新,这个问题我们可以利用进程的参数传递解决;
当然在更新程序里面需要有这方面的逻辑判断;
入口的地方我们进行判断,更新方式;这里的下载远程更新包是用WebClient对象,也可以用其他的基于Socket的对象;更新开始之前需要先判断本地的版本号是否小于远程版本号,如果小于在进行更新;
因为下载的过程是异步的所以需要用到后台线程建议大家使用System.ComponentModel.BackgroundWorker这个后台线程对象,他对Thread进行了很好的封装;下面来看一下核心的流程代码:
view sourceprint?01
//开始辅助线程操作
02
????????
private
void
Back_thread_DoWork(
object
sender, DoWorkEventArgs e)
03
????????
{
04
????????????
try
05
????????????
{
06
????????????????
//实例化下载对象
07
????????????????
downclient =
new
WebClient();
08
????????????????
downclient.DownloadProgressChanged +=
new
DownloadProgressChangedEventHandler(downclient_DownloadProgressChanged);
09
????????????????
downclient.DownloadFileCompleted +=
new
AsyncCompletedEventHandler(downclient_DownloadFileCompleted);
10
????????????????
//下载远程更新包down.zip压缩文件|放在应用程序目录下|相应界面事件
11
????????????????
downclient.DownloadFileAsync(
new
Uri(Util.GetUpdateUrl() +
"down.zip"
), Util.GetDictiory() +
"\\down.zip"
);
12
????????????
}
13
????????????
catch
(Exception err) { System.Diagnostics.Debug.WriteLine(err); }
14
????????
}
15
????????
//在异步下载结束时触发该事件
16
????????
void
downclient_DownloadFileCompleted(
object
sender, AsyncCompletedEventArgs e)
17
????????
{
18
????????????
try
19
????????????
{
20
?
?21
????????????????
if
(e.Error !=
null
)
22
????????????????
{
23
????????????????????
eventLog1.WriteEntry(e.Error.ToString());
24
????????????????????
MessageBox.Show(
"在进行远程更新时,发生错误"
,
"信息提示"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
25
????????????????
}
26
????????????????
else
27
????????????????
{
28
????????????????????
Util.KillProcess();
//关闭主进程
29
????????????????????
//验证哈希值
30
????????????????????
if
(Util.IsHash(Util.GetHash(Util.GetDictiory() +
"\\down.zip"
), FileWork.GetDownHash()))
31
????????????????????
{
32
????????????????????????
//删除无用压缩文件
33
????????????????????????
File.Delete(Util.GetDictiory() +
"\\down.zip"
);
34
????????????????????????
//删除无用版本文件
35
????????????????????????
File.Delete(Util.GetDictiory() +
"\\ServerUpdateFiles.xml"
);
36
????????????????????????
MessageBox.Show(
"远程服务器更新包已发生变化,无法更新"
,
"信息提示"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
37
????????????????????????
eventLog1.WriteEntry(
"远程服务器中的更新包在制作和下载时间段中数据包发生变化,为了安全期间不给予下载!"
);
38
????????????????????????
this
.Close();
39
????????????????????
}
40
????????????????????
else
41
????????????????????
{
42
????????????????????????
//解压压缩包文件
43
????????????????????????
ReduceToUnReduceFile.unZipFile(Util.GetDictiory() +
"\\down.zip"
, Util.GetDictiory());
44
????????????????????????
//删除压缩包文件
45
????????????????????????
File.Delete(Util.GetDictiory() +
"\\down.zip"
);
46
????????????????????????
//检查文件夹层次结构
47
????????????????????????
FileWork.LookFiles(Util.GetDictiory() +
"\\down"
, Util.GetDictiory());
48
????????????????????????
//订阅复制文件事件
49
????????????????????????
FileWork.CopyFileEvent +=
new
FileWork.CopyFileDelegate(FileWork_CopyFileEvent);
50
????????????????????????
//递归复制文件
51
????????????????????????
FileWork.CopyFiles(Util.GetDictiory() +
"\\down"
, Util.GetDictiory());
52
????????????????????????
//删除临时文件夹
53
????????????????????????
FileWork.DeleteFiles(Util.GetDictiory() +
"\\down"
);
54
????????????????????????
//如果库结构更新成功,则才能更新程序的版本号,否则下次继续更新
55
????????????????????????
if
(EventChainReference.GlobalEventChain.OnAutoUpdateDb())
56
????????????????????????????
//更新本地版本号信息
57
????????????????????????????
Util.UpdateLocalXml();
58
????????????????????????
File.Delete(Util.GetDictiory() +
"\\ServerUpdateFiles.xml"
);
59
?
?60
????????????????????????
MessageBox.Show(
"升级成功!"
,
"信息提示"
);
61
????????????????????????
Util.StartProcess();
62
????????????????????????
isupdate =
true
;
63
?
?64
????????????????????
}
65
????????????????
}
66
????????????
}
67
????????????
catch
(Exception err) { eventLog1.WriteEntry(err.ToString()); }
68
????????????
Application.Exit();
69
????????
}
这部分代码是串联整个过程的代码;
自动更新大概就讲完了,几个关键的地方都给出了,希望对大家开发自动更新程序有帮助;