65.9K
CodeProject 正在变化。 阅读更多。
Home

应用程序更新下载管理器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.45/5 (9投票s)

2007年7月16日

CPOL

1分钟阅读

viewsIcon

39951

downloadIcon

1723

本文档描述了如何构建一个用于管理程序下载文件的组件。

引言

作为一名 .NET 开发者,为了实现一个检查 Web 服务器更新的项目,我使用 Microsoft 的 "ClickOnce"。 但由于此应用程序运行在锁定的 Windows 系统上,我决定自己开发一个。

背景

该项目的主要组件是:

  1. 一个位于 Web 服务器上的 XML 文件
  2. 更新组件
  3. 更新组件的客户端
  4. 主程序

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
© . All rights reserved.