如何将文本附加到现有文本文件

时间:2012-02-04 15:16:01

标签: vb.net text file-writing

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

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 错误,消息进程无法访问文件'D:\ test.txt',因为它正被另一个进程使用。即使我处理和/或关闭 StreamReader,它也无济于事。我在这里想念的是什么?

  2. 这段代码是否符合我最初的目的,即将多行写入我上面提到的同一文本文件?我是否需要进行任何更改?

  3. 非常感谢你。

2 个答案:

答案 0 :(得分: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)将覆盖该文件(如果存在)或创建新文件(如果该文件不存在)。

如果您仍然收到异常,请确保您没有在其他位置打开该文件(例如在记事本中)。

答案 1 :(得分:2)

非常方便的VB语句是Using语句,可以应用于实现IDisposable的所有资源。它确保在离开使用块之前将在任何情况下调用Dispose()。即使发生异常或代码块由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部分。