2009-03-11 6 views
0

(VB.NET, .NET 3.5)Strange "IOException était non gérée"

j'ai écrit la fonction suivante pour lire un texte à partir du fichier txt. Cela fonctionnait bien mais maintenant ce n'est pas le cas. Il continue à me donner ce message d'erreur

« IOException était non gérée » et

« Le processus ne peut pas accéder au fichier « F: \ kh_matt \ ch1.txt » parce qu'il est utilisé par un autre processus. »

Le fichier ch1.txt n'est même pas ouvert ou utilisé par un programme. J'ai essayé de déplacer ch1.txt à un autre emplacement (lecteur D) mais j'ai toujours la même erreur de message mais juste l'endroit différent qu'il indique Le processus ne peut pas accéder au dossier 'D: \ ch1.txt' parce qu'il est employé par un autre processus. "

Voici mon bloc de code:

Private Sub btnRead_Click (expéditeur de ByVal comme System.Object, ByVal e comme System.EventArgs) Poignées 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 

Il pointe toujours à ce code:

Dim M yStream en tant que nouveau StreamReader (Path.Combine (Application.StartupPath, filelocation))

Où je débogue et appuyez sur le bouton correspondant. Quelqu'un peut-il indiquer quel est le problème? Merci

Répondre

1

Il semble que vous ouvrez le fichier deux fois, ce qui est probablement ce qui cause votre erreur:

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

Êtes-vous sûr que ce que vous avez l'intention de le faire? Il semble que vous pouvez supprimer MyStream et utiliser reader à la place. En outre, vous ne devez pas utiliser Path.Combine, puisque filelocation n'est pas relatif.

+0

Oui, vous avez raison. Maintenant, je commentais ce bloc de code: 'Si System.IO.File.Exists (emplacementfichier) = True Then ' lecteur = New StreamReader (New FileStream (emplacementfichier, FileMode.Open)) 'Else ' MsgBox (emplacementfichier , MsgBoxStyle.OkOnly) 'End If –

0

Assurez-vous que vous fermez votre flux & streamreader une fois que vous avez terminé la lecture du fichier, même lorsqu'une exception est levée.

Utilisez un bloc try/finally et fermez stream/streamreader dans le bloc finally.

2

Je pense que c'est votre problème:

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

Si le fichier existe, il ouvrira un StreamReader dessus, puis essayer d'ouvrir une autre StreamReader sur le même fichier, ce qui permet de verrouiller le fichier, ce qui provoque cette ligne :

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

d'échouer.

En outre, quelques conseils:

  • envisager d'utiliser le System.IO.File.méthode ReadAllText() au lieu, beaucoup plus facile
  • si vous doit flux d'utilisation, les envelopper dans un bloc à l'aide pour vous assurer qu'ils sont libérés correctement, par exemple:

`

Dim vArray() As String 

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

(désolé si le code ci-dessus n'est pas 100% correct, je n'écris pas beaucoup VB.Net)

+0

Bon appel avec 'ReadAllText'. Je ne le savais pas. – Kobi

+0

@Ian Kemp. Merci ! : D –

+0

+1 pour l'utilisation –

0

Merci à tous pour la réponse. C'est mon erreur. J'ai oublié de commenter mon code que j'ai écrit pour le tester plus tôt. Après avoir commenté ce code, cela fonctionne comme avant.

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

Passez une bonne journée.

Questions connexes