奇怪的“IOException未处理”

时间:2009-03-11 08:37:06

标签: vb.net exception

(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 sender As System.Object,ByVal e As 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,filelocation))

我在哪里调试并按下相应的按钮。任何人都可以指出问题是什么?感谢

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

似乎你打开文件两次,这可能是导致你的错误的原因:

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

你确定这是你打算做什么的吗?您似乎可以删除MyStream并使用reader代替。此外,您不必使用Path.Combine,因为filelocation不是相对的。

答案 2 :(得分:0)

确保关闭您的信息流&一旦你读完文件,即使抛出异常,也要使用streamreader。

使用try / finally块,并关闭finally块中的stream / streamreader。

答案 3 :(得分:0)

感谢大家的回复。这是我的错。我忘了评论我之前为测试编写的代码。在对此代码进行评论之后,它就像之前一样。

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

祝你有个美好的一天。