我希望你能帮助我。我试图构建一个基于从服务器下载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>
答案 0 :(得分:1)
使用DownloadFile,而不是DownloadFileAsync。因为DownloadFileAsync不会阻止它,它将启动下载并继续执行。异步方法旨在使用事件进行处理,以便您可以在后台继续在后台继续执行主线程中的其他工作。