2011-12-15 1 views
0

나를 도울 수 있기를 바랍니다. 난 서버에서 XML 파일을 다운로드를 기반으로 프로그램 updater를 구축하려고 해요.VB.net XMLTextReader IO 예외 : "다른 프로세스에서 사용중인 파일"

서버 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 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

비동기 적으로 다운로드 중입니다. 그리고 그것이 다운로드를 끝내기를 기다리지 않고 ... –

+0

가! 어리석은 뭔가 였음을 알았습니다. 고마워, 토니! –

+0

또한 'XmlTextReader'를 직접 사용하지 않아야합니다. 대신에'XmlReader.Create'를 사용하십시오. –

답변

1

사용 DownloadFile하지 DownloadFileAsync : 그것은 여기 소용의 경우

은 XML이다. DownloadFileAsync는 차단하지 않기 때문에 다운로드를 시작하고 계속 실행합니다. 비동기 메소드는 이벤트를 사용하여 처리되므로, 다운로드가 백그라운드에서 계속 진행되는 동안 주 스레드에서 다른 작업을 계속 수행 할 수 있습니다.