2009-03-11 2 views
0

(VB.NET, .NET 3.5)Strange «IOException был необработанным»

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

«IOException был необработанное» и

«Процесс не может получить доступ к файлу.„F: \ kh_matt \ ch1.txt“, так как он используется другим процессом»

Ch1.txt даже не открыт или не используется какой-либо программой вообще. Я попытался переместить ch1.txt в другое место (Диск D), все же я получил ту же ошибку сообщения, но только в другом месте, которое говорит. Процесс не может получить доступ к файлу «D: \ ch1.txt», потому что он используется другим процессом. "

Вот мой код блока:

Private Sub btnRead_Click (ByVal отправитель Как System.Object, ByVal е Как System.EventArgs) Ручки 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 

Он всегда указывает на этот код:

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

Где я отлаживаю и нажимаю соответствующую кнопку. Может ли кто-нибудь указать, в чем проблема? Спасибо

ответ

1

Кажется, вы открыть файл в два раза, что, вероятно, что причиной вашей ошибки:

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

Вы уверены, что это то, что вы собираетесь делать? Похоже, вы можете удалить MyStream и вместо этого использовать reader. Кроме того, вам не нужно использовать Path.Combine, так как filelocation не является относительным.

+0

Да, вы получили это право. Теперь я комментировал этот код блока: 'Если System.IO.File.Exists (filelocation) = True Then ' читатель = New StreamReader (New FileStream (filelocation, FileMode.Open)) 'Else ' MsgBox (filelocation , MsgBoxStyle.OkOnly) 'Конец Если –

0

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

Используйте блок try/finally и закройте поток/streamreader в блоке finally.

2

Я думаю, что это ваша проблема:

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

Если файл существует он будет открыть StreamReader на него, а затем попытаться открыть другой StreamReader на тот же файл, который будет блокировать файл, в результате чего эта строка :

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

не работает.

Кроме того, некоторые указатели:

  • рассмотреть вопрос об использовании System.IO.File.ReadAllText() метод вместо этого, гораздо проще
  • если вы необходимо использовать потоки, завернуть их в использовании блока для обеспечения они освобождены правильно, например:

`

Dim vArray() As String 

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

(извините, если вышеуказанный код не соответствует 100%, я не пишу много VB.Net)

+0

Хороший вызов с помощью 'ReadAllText'. Не знал этого. – Kobi

+0

@Ian Kemp. Благодаря ! : D –

+0

+1 для использования –

0

Спасибо всем за ответ. Это моя ошибка. Я забыл прокомментировать мой код, который я написал для тестирования ранее. После комментирования этого кода он работает, как раньше.

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

Удачного дня.

Смежные вопросы