Visual Basic 8 (2005)Visual Studio 2005Windows 2000Windows XP中级开发Visual StudioWindows.NETVisual BasicASP.NET
应用程序更新下载管理器






2.45/5 (9投票s)
本文档描述了如何构建一个用于管理程序下载文件的组件。
引言
作为一名 .NET 开发者,为了实现一个检查 Web 服务器更新的项目,我使用 Microsoft 的 "ClickOnce"。 但由于此应用程序运行在锁定的 Windows 系统上,我决定自己开发一个。
背景
该项目的主要组件是:
- 一个位于 Web 服务器上的 XML 文件
- 更新组件
- 更新组件的客户端
- 主程序
XML 文件的结构如下:
<?xml version="1.0" encoding="utf-8" ?>
<Updates>
<update id="1" dtUpdate="2007_06_01" version="1_0_0_1" RestartFastBet="False">
<details>
<file remote="http://youWebServer/fastbet_Download/1_0_0_1/fastbet.exe"
locale="fastbet.exe" MustStart="False"></file>
<config key="Last_Update" section="Update" value="2007_06_01"></config>
</details>
</update>
<update id="2" dtUpdate="2007_07_02" version="1_0_0_1" RestartFastBet="False">
<details>
<config key="Last_Update" section="Update" value="2007_07_02"></config>
</details>
</update>
</Updates>
每个 update 标签代表程序的一个新版本。 版本的日期在 dtUpdate
属性中,位于 update
节点内,因此,如果程序的一个版本(我通过键 getSetting("FastBet", "Update", "LastUpdate")
进行匹配)较旧,我首先要做的是下载文件和元数据。
新版本的文件在 <file>
节点内的属性中找到。 属性 remote
是下载文件的 URI,而 locale
是文件在本地机器上复制到的路径。 元数据用 <config>
节点表示。 元数据部分具有用于在注册表中保存键的相同属性。
Savesetting("Fastbet", "[section]","[key]", "[value]")
下面我们可以看到它是如何工作的!
使用代码
在更新组件部分,我使用类 Update
。 在这个类中,有一个方法会获取 XML 文件,并将其加载到 XMLDoc
属性中。
Public Sub CheckForUpdate(ByVal sUrl As String)
Dim Request As HttpWebRequest = CType(WebRequest.Create(sUrl), HttpWebRequest)
Dim response As HttpWebResponse = CType(Request.GetResponse, HttpWebResponse)
Dim responseStream As StreamReader = New StreamReader
response.GetResponseStream()
Dim output As String = responseStream.ReadToEnd()
responseStream.Close()
response.Close()
xMLdOC.LoadXml(output)
End Sub
Function Main()
Try
Dim bytesProcessed As Integer = 0
Dim remoteStream As Stream = Nothing
Dim localeStream As Stream = Nothing
Dim response As HttpWebResponse = Nothing
Dim request As HttpWebRequest = CType(WebRequest.Create(remoteFile), HttpWebRequest)
response = request.GetResponse
If Not response Is Nothing Then
remoteStream = response.GetResponseStream
localeStream = File.Create(LocaleFile)
Dim buffer(1024) As Byte
Dim Bytesread As Integer
Do
Bytesread = remoteStream.Read(buffer, 0, buffer.Length)
localeStream.Write(buffer, 0, Bytesread)
bytesProcessed += Bytesread
If Bytesread = 0 Then Exit Do
Loop
If Not response Is Nothing Then response.Close()
If Not remoteStream Is Nothing Then remoteStream.Close()
If Not localeStream Is Nothing Then localeStream.Close()
End If
Return bytesProcessed