2011-12-15 25 views
0

私はあなたが私を助けることを望んでいます。私は、サーバーからXMLファイルをダウンロードすることに基づいてプログラムアップデータを構築しようとしています。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はブロックしないので、ダウンロードを開始して実行を続行します。非同期メソッドはイベントを使用して処理されるため、ダウンロードがバックグラウンドで継続している間にメインスレッドで他の作業を続行できます。

関連する問題