0

我希望你能帮助我。我正在尝试构建一个基于从服务器下载 XML 文件的程序更新程序。

想法是服务器 XML 文件包含当前版本号和安装程序位置。更新程序要么被转储到启动文件夹中,要么被安装为服务等。

程序成功读取并解析了当前版本的 xml 文件,并成功地从服务器下载了 xml 文件。但是,当我尝试从服务器解析新下载的文件时,出现错误:

'IOException 未处理' '进程无法访问文件'C:\Program Files (x86)\Test\ServerVersion.xml',因为它正被另一个进程使用。'

据我所知,在程序之外和程序内部情况并非如此,我认为我已经处理了在使用之前可以访问它的任何元素。我是否做了一些愚蠢的事情或没有正确处理事情?

代码如下,错误由第 52 行的注释标记:

Imports System.IO
Imports System.Xml.XmlTextReader
Imports System.Net
Module Module1

Sub Main()
    Dim currentreader As Xml.XmlTextReader
    Dim serverreader As Xml.XmlTextReader
    Dim download As New WebClient
    Dim Version
    Dim Versionlocation
    Dim ServerVersion
    Dim Serverlocation
    Dim Failure As Boolean = False ' Will be used for retrys in the future'

    download = New WebClient

    Try
        If Not (System.IO.File.Exists("C:\Program Files (x86)\Test\ServerVersion")) Then
            download.DownloadFileAsync(New Uri("http://192.168.2.226/SampleApp_ServerSetup/UpdateVersion.xml"), "C:\Program Files (x86)\Test\ServerVersion.xml")
            download.Dispose()
        End If
    Catch ex As Exception
        Failure = True
        Console.WriteLine("error" & ex.Message)
    End Try

    currentreader = New Xml.XmlTextReader("C:\Program Files (x86)\Test\Version.xml")
    currentreader.WhitespaceHandling = Xml.WhitespaceHandling.None

    currentreader.Read()
    currentreader.Read()

    While Not currentreader.EOF
        currentreader.Read()

        If Not currentreader.IsStartElement Then
            Exit While
        End If

        Version = currentreader.ReadElementString("AvailableVersion")
        Versionlocation = currentreader.ReadElementString("ApplicationUrl")

    End While
    currentreader.Close()

    serverreader = New Xml.XmlTextReader("C:\Program Files (x86)\Test\ServerVersion.xml")
    serverreader.WhitespaceHandling = Xml.WhitespaceHandling.None

    Console.WriteLine("Current Version: " & Version & vbNewLine & "Version Url: " & Versionlocation)

    'error here'
    serverreader.Read()
    serverreader.Read()

    While Not serverreader.EOF
        serverreader.Read()

        If Not serverreader.IsStartElement Then
            Exit While
        End If

        ServerVersion = currentreader.ReadElementString("AvailableVersion")
        Serverlocation = currentreader.ReadElementString("ApplicationUrl")

    End While

    If ServerVersion > Version Then
        Console.WriteLine("New version available : " & ServerVersion)
    End If

    serverreader.Close()

End Sub

End Module

它仍在进行中,但是如果我无法确定新版本的位置,那么编写代码来下载和执行安装程序就没有多大意义了。

如果在这里使用它是 XML:

<?xml version="1.0" encoding="UTF-8"?>
<VersionConfig>
<AvailableVersion>2.0.0.0</AvailableVersion>
<ApplicationUrl>http://192.168.2.226/EPI/2.0.0.0/</ApplicationUrl>
</VersionConfig>
4

1 回答 1

1

使用 DownloadFile,而不是 DownloadFileAsync。因为 DownloadFileAsync 没有阻塞,它会开始下载并继续执行。异步方法旨在使用事件进行处理,以便您可以在后台继续下载时继续在主线程中执行其他工作。

于 2011-12-15T18:01:44.537 回答