因为项目需要做了一个在线升级程序,非常爽,所以弄出来和大家分享一下。
可能到时候项目做大了,我会做断点续传与多任务多线程进去,当然有兴趣的朋友可以共同探讨一下
主要用到类库中的webrequest,webresponse和webclient类
另外使用到了devexpress进度条控件
有兴趣的朋友可加我qq270499458 雨浪
俺大学学的政治法律,转行到计算机有一年多了,很多地方还不足,希望高手赐教
大家一起研究.net
整个程序分为3个部分
1.客户机上的配置文件
2.服务器上的配置文件与需要更新的文件
3.客户机上的升级程序
首先介绍一下客户机上的配置文件,相关部分我会详细说明
文件名称 update.ini
文件内容
[serverpath]
address=http://www.mycom.com/update/
主要就是说明一下要获取升级文件的地址
请一定要在最后加上"/",因为我懒,在程序中没有判断是否有"/"
服务器上的配置文件
文件名称 update.xml
文件内容
<?xml version="1.0" encoding="gb2312"?>
<update>
<file>
<filename>要升级的文件名称</filename>
<version>文件的版本</version>
<lastmodifydate>文件最后修改的日期</lastmodifydate>
<filelength>文件的大小(单位为字节)</filelength>
<target>文件对于客户机运行目录下的相对地址</target>
<downurl>升级文件存放的url地址</downurl>
</file>
</update>
这里我举例说明一下用法,假如我有两个文件要升级
<?xml version="1.0" encoding="gb2312"?>
<update>
<file>
<filename>我的管理系统.exe</filename>
<version>1.0.2207.21855</version>
<lastmodifydate>2006-1-16</lastmodifydate>
<filelength>7401472</filelength>
<target>\我的管理系统.exe</target>
<downurl>http://www.mycom.com/update/main.exe</downurl>
</file>
<file>
<filename>email.dll</filename>
<version>1.0.2207.21855</version>
<lastmodifydate>2006-1-16</lastmodifydate>
<filelength>90112</filelength>
<target>\email.dll</target>
<downurl>http://www.mycom.com/update/email.dll</downurl>
</file>
</update>
我做的这个升级程序的运行机制是这样的:
在load事件里面创建一个临时文件夹,放下载的文件的
(1)首先下载update.xml
(2)将xml内容读到dataset中去
(3)判断客户机上是否有这些文件,如果没有,就是要更新的
(4)如果客户机上有这些文件,如果版本的那一列也就是version不为空的话,将与客户机进行版本比对
(5)如果版本那一列为空,将进行最后修改日期比对,因为有些更新的不是有版本的文件,比如文本文件,就需要进行最后修改日期比对
(6)如果版本或者修改日期都一样,就不需要更新,从dataset中删除那些不需要更新的文件行
(7)下载文件
(8)杀掉运行的主程序进程
(9)将要更新的文件复制到目标处
(10)删除临时文件夹的所有内容
(11)运行主程序
webasp这个发表文档不能发图片,好郁闷呀~~~~~
再说说重点,客户机上的升级程序,我把所有程序都贴在里面了。大家研究研究,如果照搬是不能运行的,稍微修改就可以了,因为我引用了我自己做的几个类,没有也不需要贴出来,还有用到了devexpress控件,不过要点都注释了。
具体代码如下:
imports system
imports system.net
imports system.text
imports system.threading
imports commanfunc
imports scripting
imports system.io
imports api
friend class update
inherits system.windows.forms.form
private mywebclient as new webclient
private bytenum as long
private threaddown, threadchk as thread
private mybyte() as byte
private zipsize as long
private func as new func
private fso as new filesystemobject
private fl as scripting.file
private ready as string = application.startuppath & "\images\ready.ico"
private down as string = application.startuppath & "\images\down.ico"
private inipath as string = application.startuppath & "\update.ini"
private tempfolder as string = application.startuppath & "\temp_download" 临时下载文件夹
private address as string 下载网站
private updatedataset as new dataset 升级配置文件数据集
private curversion as string
private alldownloadbyte as long = 0
private runthread as thread 执行时候运行的线程
private myapi as new api.myapi
#region " windows 窗体设计器生成的代码 "
public sub new()
mybase.new()
该调用是 windows 窗体设计器所必需的。
initializecomponent()
在 initializecomponent() 调用之后添加任何初始化
end sub
窗体重写 dispose 以清理组件列表。
protected overloads overrides sub dispose(byval disposing as boolean)
if disposing then
if not (components is nothing) then
components.dispose()
end if
end if
mybase.dispose(disposing)
end sub
windows 窗体设计器所必需的
private components as system.componentmodel.icontainer
注意: 以下过程是 windows 窗体设计器所必需的
可以使用 windows 窗体设计器修改此过程。
不要使用代码编辑器修改它。
friend withevents picturebox1 as system.windows.forms.picturebox
friend withevents label1 as system.windows.forms.label
friend withevents label2 as system.windows.forms.label
friend withevents groupbox1 as system.windows.forms.groupbox
friend withevents picturebox2 as system.windows.forms.picturebox
friend withevents picturebox3 as system.windows.forms.picturebox
friend withevents label5 as system.windows.forms.label
friend withevents label6 as system.windows.forms.label
friend withevents lbl as system.windows.forms.label
friend withevents btnupdate as system.windows.forms.button
friend withevents btnclose as system.windows.forms.button
friend withevents label8 as system.windows.forms.label
friend withevents label9 as system.windows.forms.label
friend withevents label10 as system.windows.forms.label
friend withevents picturebox4 as system.windows.forms.picturebox
friend withevents picturebox9 as system.windows.forms.picturebox
friend withevents progressdownload as devexpress.xtraeditors.progressbarcontrol
friend withevents label4 as system.windows.forms.label
friend withevents progresscdownload as devexpress.xtraeditors.progressbarcontrol
friend withevents label7 as system.windows.forms.label
friend withevents picturebox5 as system.windows.forms.picturebox
friend withevents picturebox6 as system.windows.forms.picturebox
friend withevents picturebox7 as system.windows.forms.picturebox
friend withevents picturebox8 as system.windows.forms.picturebox
friend withevents imagelist1 as system.windows.forms.imagelist
friend withevents label3 as system.windows.forms.label
<system.diagnostics.debuggerstepthrough()> private sub initializecomponent()
me.components = new system.componentmodel.container
dim resources as system.resources.resourcemanager = new system.resources.resourcemanager(gettype(update))
me.picturebox1 = new system.windows.forms.picturebox
me.label1 = new system.windows.forms.label
me.imagelist1 = new system.windows.forms.imagelist(me.components)
me.label2 = new system.windows.forms.label
me.groupbox1 = new system.windows.forms.groupbox
me.progresscdownload = new devexpress.xtraeditors.progressbarcontrol
me.label4 = new system.windows.forms.label
me.progressdownload = new devexpress.xtraeditors.progressbarcontrol
me.label5 = new system.windows.forms.label
me.picturebox2 = new system.windows.forms.picturebox
me.picturebox3 = new system.windows.forms.picturebox
me.picturebox4 = new system.windows.forms.picturebox
me.label6 = new system.windows.forms.label
me.btnupdate = new system.windows.forms.button
me.lbl = new system.windows.forms.label
me.btnclose = new system.windows.forms.button
me.picturebox5 = new system.windows.forms.picturebox
me.label8 = new system.windows.forms.label
me.picturebox6 = new system.windows.forms.picturebox
me.label9 = new system.windows.forms.label
me.picturebox7 = new system.windows.forms.picturebox
me.label10 = new system.windows.forms.label
me.picturebox9 = new system.windows.forms.picturebox
me.picturebox8 = new system.windows.forms.picturebox
me.label7 = new system.windows.forms.label
me.label3 = new system.windows.forms.label
me.groupbox1.suspendlayout()
ctype(me.progresscdownload.properties, system.componentmodel.isupportinitialize).begininit()
ctype(me.progressdownload.properties, system.componentmodel.isupportinitialize).begininit()
me.suspendlayout()
picturebox1
me.picturebox1.location = new system.drawing.point(16, 72)
me.picturebox1.name = "picturebox1"
me.picturebox1.size = new system.drawing.size(24, 24)
me.picturebox1.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox1.tabindex = 0
me.picturebox1.tabstop = false
label1
me.label1.imagelist = me.imagelist1
me.label1.location = new system.drawing.point(64, 80)
me.label1.name = "label1"
me.label1.size = new system.drawing.size(128, 16)
me.label1.tabindex = 1
me.label1.text = "正在连接到服务器…"
imagelist1
me.imagelist1.imagesize = new system.drawing.size(16, 16)
me.imagelist1.imagestream = ctype(resources.getobject("imagelist1.imagestream"), system.windows.forms.imageliststreamer)
me.imagelist1.transparentcolor = system.drawing.color.transparent
label2
me.label2.location = new system.drawing.point(64, 112)
me.label2.name = "label2"
me.label2.size = new system.drawing.size(128, 16)
me.label2.tabindex = 3
me.label2.text = "正在检查可更新版本…"
groupbox1
me.groupbox1.controls.add(me.progresscdownload)
me.groupbox1.controls.add(me.label4)
me.groupbox1.controls.add(me.progressdownload)
me.groupbox1.controls.add(me.label5)
me.groupbox1.location = new system.drawing.point(8, 216)
me.groupbox1.name = "groupbox1"
me.groupbox1.size = new system.drawing.size(456, 104)
me.groupbox1.tabindex = 14
me.groupbox1.tabstop = false
me.groupbox1.text = "下载进度"
progresscdownload
me.progresscdownload.accessiblename = "custom"
me.progresscdownload.location = new system.drawing.point(80, 32)
me.progresscdownload.name = "progresscdownload"
progresscdownload.properties
me.progresscdownload.properties.borderstyle = devexpress.xtraeditors.controls.borderstyles.hotflat
me.progresscdownload.properties.endcolor = system.drawing.color.cornsilk
me.progresscdownload.properties.lookandfeel.usedefaultlookandfeel = false
me.progresscdownload.properties.lookandfeel.usewindowsxptheme = false
me.progresscdownload.properties.progressviewstyle = devexpress.xtraeditors.controls.progressviewstyle.solid
me.progresscdownload.properties.showtitle = true
me.progresscdownload.properties.startcolor = system.drawing.color.burlywood
me.progresscdownload.size = new system.drawing.size(352, 21)
me.progresscdownload.tabindex = 6
me.progresscdownload.tabstop = false
label4
me.label4.location = new system.drawing.point(16, 37)
me.label4.name = "label4"
me.label4.size = new system.drawing.size(64, 16)
me.label4.tabindex = 5
me.label4.text = "当前进度"
progressdownload
me.progressdownload.accessiblename = "custom"
me.progressdownload.location = new system.drawing.point(80, 64)
me.progressdownload.name = "progressdownload"
progressdownload.properties
me.progressdownload.properties.borderstyle = devexpress.xtraeditors.controls.borderstyles.hotflat
me.progressdownload.properties.endcolor = system.drawing.color.cornsilk
me.progressdownload.properties.lookandfeel.usedefaultlookandfeel = false
me.progressdownload.properties.lookandfeel.usewindowsxptheme = false
me.progressdownload.properties.progressviewstyle = devexpress.xtraeditors.controls.progressviewstyle.solid
me.progressdownload.properties.showtitle = true
me.progressdownload.properties.startcolor = system.drawing.color.burlywood
me.progressdownload.size = new system.drawing.size(352, 21)
me.progressdownload.tabindex = 4
me.progressdownload.tabstop = false
label5
me.label5.location = new system.drawing.point(16, 69)
me.label5.name = "label5"
me.label5.size = new system.drawing.size(64, 16)
me.label5.tabindex = 1
me.label5.text = "总体进度"
picturebox2
me.picturebox2.location = new system.drawing.point(16, 104)
me.picturebox2.name = "picturebox2"
me.picturebox2.size = new system.drawing.size(24, 24)
me.picturebox2.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox2.tabindex = 15
me.picturebox2.tabstop = false
picturebox3
me.picturebox3.location = new system.drawing.point(16, 136)
me.picturebox3.name = "picturebox3"
me.picturebox3.size = new system.drawing.size(24, 24)
me.picturebox3.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox3.tabindex = 16
me.picturebox3.tabstop = false
picturebox4
me.picturebox4.location = new system.drawing.point(16, 168)
me.picturebox4.name = "picturebox4"
me.picturebox4.size = new system.drawing.size(24, 24)
me.picturebox4.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox4.tabindex = 18
me.picturebox4.tabstop = false
label6
me.label6.location = new system.drawing.point(64, 176)
me.label6.name = "label6"
me.label6.size = new system.drawing.size(128, 16)
me.label6.tabindex = 17
me.label6.text = "正在下载更新版本…"
btnupdate
me.btnupdate.location = new system.drawing.point(280, 336)
me.btnupdate.name = "btnupdate"
me.btnupdate.size = new system.drawing.size(96, 24)
me.btnupdate.tabindex = 19
me.btnupdate.text = "开始升级"
lbl
me.lbl.forecolor = system.drawing.color.red
me.lbl.location = new system.drawing.point(16, 344)
me.lbl.name = "lbl"
me.lbl.size = new system.drawing.size(248, 16)
me.lbl.tabindex = 20
btnclose
me.btnclose.location = new system.drawing.point(384, 336)
me.btnclose.name = "btnclose"
me.btnclose.size = new system.drawing.size(80, 24)
me.btnclose.tabindex = 21
me.btnclose.text = "关闭"
picturebox5
me.picturebox5.location = new system.drawing.point(224, 72)
me.picturebox5.name = "picturebox5"
me.picturebox5.size = new system.drawing.size(24, 24)
me.picturebox5.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox5.tabindex = 25
me.picturebox5.tabstop = false
label8
me.label8.location = new system.drawing.point(272, 80)
me.label8.name = "label8"
me.label8.size = new system.drawing.size(136, 16)
me.label8.tabindex = 24
me.label8.text = "正在关闭应用程序…"
picturebox6
me.picturebox6.location = new system.drawing.point(224, 104)
me.picturebox6.name = "picturebox6"
me.picturebox6.size = new system.drawing.size(24, 24)
me.picturebox6.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox6.tabindex = 27
me.picturebox6.tabstop = false
label9
me.label9.location = new system.drawing.point(272, 112)
me.label9.name = "label9"
me.label9.size = new system.drawing.size(136, 16)
me.label9.tabindex = 26
me.label9.text = "正在执行更新过程…"
picturebox7
me.picturebox7.location = new system.drawing.point(224, 136)
me.picturebox7.name = "picturebox7"
me.picturebox7.size = new system.drawing.size(24, 24)
me.picturebox7.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox7.tabindex = 29
me.picturebox7.tabstop = false
label10
me.label10.location = new system.drawing.point(272, 144)
me.label10.name = "label10"
me.label10.size = new system.drawing.size(136, 16)
me.label10.tabindex = 28
me.label10.text = "更新完成,删除临时文件"
picturebox9
me.picturebox9.backcolor = system.drawing.systemcolors.highlighttext
me.picturebox9.dock = system.windows.forms.dockstyle.top
me.picturebox9.image = ctype(resources.getobject("picturebox9.image"), system.drawing.image)
me.picturebox9.location = new system.drawing.point(0, 0)
me.picturebox9.name = "picturebox9"
me.picturebox9.size = new system.drawing.size(474, 58)
me.picturebox9.tabindex = 30
me.picturebox9.tabstop = false
picturebox8
me.picturebox8.location = new system.drawing.point(224, 168)
me.picturebox8.name = "picturebox8"
me.picturebox8.size = new system.drawing.size(24, 24)
me.picturebox8.sizemode = system.windows.forms.pictureboxsizemode.stretchimage
me.picturebox8.tabindex = 32
me.picturebox8.tabstop = false
label7
me.label7.location = new system.drawing.point(272, 176)
me.label7.name = "label7"
me.label7.size = new system.drawing.size(136, 16)
me.label7.tabindex = 31
me.label7.text = "更新成功,开启应用程序"
label3
me.label3.location = new system.drawing.point(64, 144)
me.label3.name = "label3"
me.label3.size = new system.drawing.size(128, 16)
me.label3.tabindex = 5
me.label3.text = "正在收集本机信息…"
update
me.autoscalebasesize = new system.drawing.size(6, 14)
me.clientsize = new system.drawing.size(474, 375)
me.controls.add(me.picturebox8)
me.controls.add(me.label7)
me.controls.add(me.picturebox9)
me.controls.add(me.picturebox7)
me.controls.add(me.label10)
me.controls.add(me.picturebox6)
me.controls.add(me.label9)
me.controls.add(me.picturebox5)
me.controls.add(me.label8)
me.controls.add(me.btnclose)
me.controls.add(me.lbl)
me.controls.add(me.btnupdate)
me.controls.add(me.picturebox4)
me.controls.add(me.label6)
me.controls.add(me.picturebox3)
me.controls.add(me.picturebox2)
me.controls.add(me.groupbox1)
me.controls.add(me.label3)
me.controls.add(me.label2)
me.controls.add(me.label1)
me.controls.add(me.picturebox1)
me.formborderstyle = system.windows.forms.formborderstyle.fixeddialog
me.icon = ctype(resources.getobject("$this.icon"), system.drawing.icon)
me.maximizebox = false
me.minimizebox = false
me.name = "update"
me.showintaskbar = false
me.text = "在线升级"
me.topmost = true
me.groupbox1.resumelayout(false)
ctype(me.progresscdownload.properties, system.componentmodel.isupportinitialize).endinit()
ctype(me.progressdownload.properties, system.componentmodel.isupportinitialize).endinit()
me.resumelayout(false)
end sub
#end region
载入
private sub update_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load
myapi.disablex(me) 让关闭x不可用
reset()
getaddress()
end sub
还原状态
private sub reset()
picturebox1.image = image.fromfile(ready)
picturebox2.image = image.fromfile(ready)
picturebox3.image = image.fromfile(ready)
picturebox4.image = image.fromfile(ready)
picturebox5.image = image.fromfile(ready)
picturebox6.image = image.fromfile(ready)
picturebox7.image = image.fromfile(ready)
picturebox8.image = image.fromfile(ready)
lbl.text = ""
btnupdate.enabled = true
btnclose.enabled = true
end sub
让btn可用
private sub resetbtn()
btnupdate.enabled = true
btnclose.enabled = true
end sub
检测文件夹是否存在,不存在则建立
private sub chkexsitfolder(byval foldername as string)
if fso.folderexists(foldername) = false then
fso.createfolder(foldername)
end if
end sub
检测文件是否存在,返回boolean值
private function chkexsitfile(byval filename as string) as boolean
return fso.fileexists(filename)
end function
获取文件版本信息 获取成功返回版本值,不成功返回nothing
private function getcurversion(byval filepath as string) as string
try
curversion = fileversioninfo.getversioninfo(filepath).fileversion.tostring
return curversion
catch ex as exception
return nothing
end try
end function
获取配置文件中的地址 地址最后必须加上"/"
private sub getaddress()
try
address = func.getkeyval(inipath, "serverpath", "address")
catch ex as exception
lbl.text = "连接服务器失败…"
resetbtn()
exit sub
end try
end sub
测试连接到服务器 并下载升级文件
private sub connectsvr()
picturebox1.image = image.fromfile(down)
try
if fso.folderexists(tempfolder) = false then 如果不存在临时文件夹子,则先建立
fso.createfolder(tempfolder)
end if
mywebclient.downloadfile(address & "update.xml", tempfolder & "\update.xml")
catch ex as exception
lbl.text = "连接服务器失败…"
resetbtn()
exit sub
end try
end sub
检查更新版本 读取数据集 如果数据集为空则失败
private sub getnewversion()
picturebox2.image = image.fromfile(down)
try
updatedataset.readxml(tempfolder & "\update.xml")
if updatedataset.tables(0).rows.count <= 0 or (updatedataset is nothing) then
lbl.text = "检查可更新版本失败…"
reset()
end if
catch ex as exception
lbl.text = "检查可更新版本失败…"
resetbtn()
exit sub
end try
end sub
分析更新版本 并获取所有要下载的字节数
private sub chkupdate()
picturebox3.image = image.fromfile(down)
alldownloadbyte = 0
chkupdatemethod()
if updatedataset.tables("file").rows.count = 0 then
lbl.text = "您目前的版本已经是最新版…"
resetbtn()
exit sub
end if
end sub
分析更新版本具体方法,采用了递归
private sub chkupdatemethod()
dim i as integer
try
for i = 0 to updatedataset.tables(0).rows.count – 1
分析存在性,如果不存在则是需要升级的,如果存在分析版本 如果版本为空则分析最后修改时间
if chkexsitfile(application.startuppath & updatedataset.tables("file").rows(i)("target")) = true then
如果版本号相等则删除此行
if func.cdbnull(updatedataset.tables("file").rows(i)("version")) <> "" then
if getcurversion(application.startuppath & updatedataset.tables("file").rows(i)("target")) = updatedataset.tables("file").rows(i)("version") then
updatedataset.tables("file").rows.item(i).delete()
chkupdatemethod()
exit sub
else
alldownloadbyte += updatedataset.tables("file").rows(i)("filelength")
end if
else
如果修改时间大于或者相等则删除此行
fl = fso.getfile(application.startuppath & updatedataset.tables("file").rows(i)("target"))
if fl.datelastmodified >= ctype(updatedataset.tables("file").rows(i)("lastmodifydate"), date) then
updatedataset.tables("file").rows.item(i).delete()
chkupdatemethod()
exit sub
else
alldownloadbyte += updatedataset.tables("file").rows(i)("filelength")
end if
end if
else
alldownloadbyte += updatedataset.tables("file").rows(i)("filelength")
end if
next
catch ex as exception
lbl.text = "升级失败,无法分析更新版本…"
resetbtn()
exit sub
end try
end sub
private sub downfiles()
connectsvr()
if btnupdate.enabled = true then
exit sub
end if
getnewversion()
if btnupdate.enabled = true then
exit sub
end if
chkupdate()
if btnupdate.enabled = true then
exit sub
end if
dim i as integer
dim srm as stream
dim mbyte() as byte
dim allbyte as long
dim startbyte as integer
dim m as integer
dim fs as filestream
dim myre as httpwebrequest
dim mwrite as httpwebresponse
dim wc as webclient = new webclient
picturebox4.image = image.fromfile(down)
progressdownload.position = 0
progressdownload.properties.maximum = alldownloadbyte
try
for i = 0 to updatedataset.tables("file").rows.count – 1
groupbox1.text = "下载进度(" & (i + 1).tostring & "/" & updatedataset.tables("file").rows.count & ")"
progresscdownload.position = 0 设置当前进度为0
startbyte = 0 开始下载的位置为0
redim mbyte(clng(updatedataset.tables("file").rows(i)("filelength"))) 本也可以直接获取文件大小,但是很占用资源,干脆写在配置文件内
myre = ctype(webrequest.create(updatedataset.tables("file").rows(i)("downurl")), httpwebrequest)
mwrite = ctype(myre.getresponse(), httpwebresponse)
srm = wc.openread(updatedataset.tables("file").rows(i)("downurl"))
allbyte = mbyte.length
progresscdownload.properties.maximum = allbyte
progresscdownload.position = 0
do while updatedataset.tables("file").rows(i)("filelength") > 0
m = srm.read(mbyte, startbyte, allbyte)
if m = 0 then exit do
startbyte += m
allbyte -= m
progresscdownload.position += m
progressdownload.position += m
loop
fs = new filestream(tempfolder & "\" & updatedataset.tables("file").rows(i)("filename"), filemode.openorcreate)
fs.write(mbyte, 0, mbyte.length)
fs.flush()
fs.close()
myre.abort() 这里必须释放资源,否则下载多个文件出现连接超时错误
srm.close()
runthread.sleep(2000) 这里每下一个文件让线程等待2秒,太快可能服务器没有响应
next
progressdownload.position = alldownloadbyte 防止人为写错字节数不到100的现象
catch ex as exception
lbl.text = "下载更新文件失败…"
srm.close()
myre.abort()
resetbtn()
exit sub
end try
closeexe()
updatefile()
deltmpfiles()
if btnupdate.enabled = true then
exit sub
end if
startexe()
end sub
关闭应用程序
private sub closeexe()
picturebox5.image = image.fromfile(down)
func.killprogress("我的管理系统") 这里是我引用的一个类,用来杀进程的
end sub
更新要升级的文件
private sub updatefile()
picturebox6.image = image.fromfile(down)
try
dim i as integer
dim flcopy as io.file
for i = 0 to updatedataset.tables("file").rows.count – 1
flcopy.copy(tempfolder & "\" & updatedataset.tables("file").rows(i)("filename"), application.startuppath & updatedataset.tables("file").rows(i)("target"), true)
next
catch ex as exception
lbl.text = "升级到新版本失败,可能应用程序未关闭…"
resetbtn()
exit sub
end try
end sub
删除文件
private sub deltmpfiles()
picturebox7.image = image.fromfile(down)
try
fso.deletefolder(tempfolder, true)
catch ex as exception
exit sub
end try
end sub
启动应用程序
private sub startexe()
picturebox8.image = image.fromfile(down)
try
system.diagnostics.process.start(application.startuppath & "\我的管理系统.exe")
catch ex as exception
lbl.text = "更新成功,但未能启动应用程序,请手动启动…"
finally
btnclose.enabled = true
end try
end sub
升级
private sub btnupdate_click(byval sender as system.object, byval e as system.eventargs) handles btnupdate.click
reset()
btnupdate.enabled = false
btnclose.enabled = false
groupbox1.text = "下载进度"
lbl.text = ""
updatedataset.clear()
runthread = new thread(addressof downfiles) 不知道为什么,用了join后将会出现卡屏,用线程池\完成事件\轮循都不行,我只有把其他事件放在这个线程里了。郁闷
runthread.start()
runthread.join()
end sub
private sub btnclose_click(byval sender as system.object, byval e as system.eventargs) handles btnclose.click
me.close()
end sub
end class
这个升级程序运行的比较稳定,但是还有很多不足,特别对于线程的控制,很难把握。希望高手不另赐教~~~