2009-03-11 21 views
0

(VB.NET, .NET 3,5)Strange "IOException wurde nicht behandelt"

ich die folgende Funktion einen Text aus txt-Datei lesen geschrieben. Es funktionierte gut, aber jetzt ist es nicht. Es hält mir diese Fehlermeldung zu geben

„IOException wurde nicht behandelt“ und

„Der Prozess kann nicht auf die Datei zugreifen.‚F: \ kh_matt \ ch1.txt‘, weil sie von einem anderen Prozess verwendet wird“

Die Datei ch1.txt wird von keinem Programm überhaupt geöffnet oder benutzt. Ich habe versucht, ch1.txt an einen anderen Ort zu verschieben (Laufwerk D), aber ich habe den gleichen Nachrichtenfehler, aber nur an anderer Stelle heißt es Der Prozess kann nicht auf die Datei 'D: \ ch1.txt' zugreifen, weil er von einem anderen Prozess verwendet wird. "

Hier ist mein Code-Block:

private Sub btnRead_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Griffe btnRead.Click

Dim reader As StreamReader 
    Dim filelocation As String 

    filelocation = "F:\kh_matt\ch1.txt" 
    Dim chid As Integer 

    chid = 1 


    If System.IO.File.Exists(filelocation) = True Then 
     reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 
    Else 
     MsgBox(filelocation, MsgBoxStyle.OkOnly) 
    End If 

    Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 
    Dim vArray() As String = MyStream.ReadToEnd.Split(CChar("$")) 
    MyStream.Close() 


    Dim count As Integer 

    For d As Integer = 0 To vArray.Length - 1 Step 1 

     If d = vArray.Length - 1 Then 
      Exit For 
     End If 

     InsertKh(chid, d + 1, vArray(d)) 
     count = d + 1 
    Next 


    MsgBox("Done Inserting") 
End Sub 

Es zeigt immer auf diesem Code:

Abm. M yStream als neuer StreamReader (Path.Combine (Application.StartupPath, filelocation))

Wo ich debuggen und die entsprechende Taste drücken. Kann jemand darauf hinweisen, was das Problem ist? Danke

Antwort

1

Es scheint, dass Sie die Datei zweimal öffnen, was wahrscheinlich ist, was Ihr Fehler verursacht:

reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 
... 
Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 

Sind Sie sicher, dass das, was Sie zu tun beabsichtigen? Es sieht so aus, als könnten Sie MyStream entfernen und stattdessen reader verwenden. Außerdem müssen Sie Path.Combine nicht verwenden, da filelocation nicht relativ ist.

+0

Ja, das hast du richtig verstanden. Jetzt bemerkte ich aus diesem Codeblock: 'Wenn System.IO.File.Exists (filelocation) = True Then ' reader = new Stream (New Filestream (filelocation, FileMode.Open)) 'Else ' MsgBox (filelocation , MsgBoxStyle.OkOnly) 'Ende Wenn –

0

Stellen Sie sicher, dass Sie Ihren Stream & streamreader schließen, nachdem Sie die Datei gelesen haben, auch wenn eine Ausnahme ausgelöst wird.

Verwenden Sie einen try/finally-Block und schließen Sie den stream/streamreader im finally-Block.

2

Ich denke, das ist Ihr Problem:

If System.IO.File.Exists(filelocation) = True Then 
    reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 

Wenn die Datei vorhanden ist, wird es ein Stream auf sie öffnen, dann versuchen und einen anderen Stream auf der gleichen Datei zu öffnen, die die Datei sperren wird, so dass diese Zeile :

Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 

fehlschlagen. Auch

, einige Hinweise:

  • betrachten die System.IO.File verwenden.ReadAllText() -Methode stattdessen viel einfacher
  • wenn Sie Muss Verwendung Ströme, wickeln Sie sie in einem mit Block, um sicherzustellen, sie sind richtig befreit, zum Beispiel:

`

Dim vArray() As String 

using (Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 
{ 
    vArray = MyStream.ReadToEnd.Split(CChar("$")) 
} 

(Sorry, wenn der obige Code nicht 100% korrekt ist, schreibe ich nicht viel VB.Net)

+0

Guter Anruf mit dem 'ReadAllText'. Ich kannte das nicht. – Kobi

+0

@Ian Kemp. Vielen Dank ! : D –

+0

+1 für die Verwendung –

0

Vielen Dank für die Antwort. Es ist mein Fehler. Ich habe vergessen, meinen Code, den ich zum Testen geschrieben habe, zu kommentieren. Nach dem Kommentieren dieses Codes funktioniert es wie zuvor.

'If System.IO.File.Exists(filelocation) = True Then 
    ' reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 
    'Else 
    ' MsgBox(filelocation, MsgBoxStyle.OkOnly) 
    'End If 

Einen schönen Tag.

Verwandte Themen