Исключение ввода-вывода VB.net XMLTextReader: «Файл используется другим процессом» - PullRequest
0 голосов
/ 15 декабря 2011

Я надеюсь, что вы можете мне помочь.Я пытаюсь создать средство обновления программы, основанное на загрузке файлов XML с сервера.

Идея состоит в том, что файл XML сервера содержит текущий номер версии и расположение установщика.программа обновления либо выгружается в папку автозагрузки, либо устанавливается как служба и т. д.

Программа успешно читает и анализирует XML-файл текущей версии и успешно загружает XML-файл с сервера.Однако, когда я пытаюсь проанализировать только что загруженный файл с сервера, я получаю сообщение об ошибке:

'IOException is nothandled' 'Процесс не может получить доступ к файлу' 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 Ответ

1 голос
/ 15 декабря 2011

Используйте DownloadFile, а не DownloadFileAsync. Поскольку DownloadFileAsync не блокирует, он начнет загрузку и продолжит выполнение. Асинхронные методы предназначены для обработки с использованием событий, чтобы вы могли продолжать выполнять другие операции в главном потоке, пока загрузка продолжается в фоновом режиме.

...