Странно "IOException был необработан" - PullRequest
0 голосов
/ 11 марта 2009

(VB.NET, .NET 3.5)

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

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

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

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

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

Private Sub btnRead_Click (отправитель ByVal как System.Object, ByVal e как 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 MyStream As New StreamReader (Path.Combine (Application.StartupPath, расположение файла))

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

Ответы [ 4 ]

2 голосов
/ 11 марта 2009

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

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 (), намного проще
  • если вы должны использовать потоки, оберните их в блок using, чтобы убедиться, что они освобождены правильно, например:

`

Dim vArray() As String

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

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

1 голос
/ 11 марта 2009

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

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

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

0 голосов
/ 11 марта 2009

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

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

Хорошего дня.

0 голосов
/ 11 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...