1

我有一个程序,它以以下格式将数据写入文本文件。

test1   -    test1     -     test1     -     test1

写完第一行后,文本字段被清除,以便为另一轮用户输入腾出空间。简单地说,它应该是这样的:

test1   -    test1     -     test1     -     test1
test2   -    test2     -     test2     -     test2
test3   -    test3     -     test3     -     test3

这是我的代码

If Not File.Exists(path) Then
    MessageBox.Show("File doesn't exist in the given path", "No File", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Exit Sub
Else

    Dim reader As New StreamReader(path)
    reader = File.OpenText(path)
    Dim content As String = reader.ReadToEnd
    reader.Dispose()
    reader.Close()

    Dim writer As New StreamWriter(path)  'this is where the exception occurs
    writer.Write("Origin : " & Trim(loadOrigin) & vbTab & "-" & vbTab)
    writer.Write("Destination : " & Trim(destination) & vbTab & vbCrLf & vbCrLf)

    writer.Write(Trim(txtCarrier.Text) & vbTab & "-" & vbTab)
    writer.Write(Trim(txtLocation.Text) & vbTab & "-" & vbTab)
    writer.Write(Trim(txtDest.Text) & vbTab & "-" & vbTab)
    writer.Write(Trim(txtNotes.Text) & vbTab & vbCrLf & vbCrLf)

    writer.Close()
    MessageBox.Show("Text written to file", "Data Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)
    clearFields()

End If
  1. 我曾经StreamReader阅读文本文件中已有的内容并到达它的末尾以追加新行。但是,它显示IOException错误消息The process cannot access the file 'D:\test.txt' because it is being used by another process。即使在我处置和/或关闭. StreamReader我在这里想念什么?

  2. 这段代码能否实现我在上面提到的将多行写入同一个文本文件的最初目的?我必须做出任何改变吗?

非常感谢大家。

4

2 回答 2

5

reader.Close()应该关闭文件并释放它的所有资源。尝试在调用之前关闭文件Dispose(根据 MSDN,不需要,因为该Close方法会为您执行此操作。

Dim writer As New StreamWriter(path, True)将打开文件以添加文本。Dim writer As New StreamWriter(path)Dim writer As New StreamWriter(path, False)将覆盖文件(如果存在)或创建新文件(如果不存在)。

如果您仍然遇到异常,请确保您没有在其他地方打开文件(如在记事本中)。

于 2012-02-04T16:01:08.007 回答
2

一个非常方便的 VB 语句是Using语句,它可以应用于所有实现IDisposable. 它确保Dispose()在离开 using 块之前在任何情况下都会调用它。例如,即使发生异常或代码块被留下Return。(除非你拔掉插头)。

Dispose(),反过来,关闭流。

Dim content As String 
Using reader As StreamReader = File.OpenText(Path)
    content = reader.ReadToEnd
End Using

Using writer As New StreamWriter(Path, True) 'True for append mode
    writer.Write("Origin : " & Trim(loadOrigin) & vbTab & "-" & vbTab)
    writer.Write("Destination : " & Trim(destination) & vbTab & vbCrLf & vbCrLf)

    writer.Write(Trim(txtCarrier.Text) & vbTab & "-" & vbTab)
    writer.Write(Trim(txtLocation.Text) & vbTab & "-" & vbTab)
    writer.Write(Trim(txtDest.Text) & vbTab & "-" & vbTab)
    writer.Write(Trim(txtNotes.Text) & vbTab & vbCrLf & vbCrLf)
End Using
MessageBox.Show("Text written to file", "Data Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)
clearFields()

注意:Dim reader As New StreamReader(path)已过时,因为您随后立即使用reader = File.OpenText(path). Dim reader As StreamReader就足够了。

另请注意,无需阅读到文件末尾即可附加更多文本。True作为第二个构造函数参数的值StreamWriter本身就是这样做的。除非您出于其他原因需要阅读现有内容,否则您应该StreamReader完全放弃该部分。

于 2012-02-04T17:53:21.340 回答