VB.net XMLTextReader IO异常:“另一个进程正在使用的文件”

时间:2011-12-15 17:51:31

标签: xml vb.net auto-update xmltextreader

我希望你能帮助我。我试图构建一个基于从服务器下载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>

1 个答案:

答案 0 :(得分:1)

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