我有一个程序,它以下列格式将数据写入文本文件。
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
我使用StreamReader
来读取文本文件中已有的内容并到达其末尾以附加新行。但是,它显示 IOException 错误,消息进程无法访问文件'D:\ test.txt',因为它正被另一个进程使用。即使我处理和/或关闭 StreamReader
,它也无济于事。我在这里想念的是什么?
这段代码是否符合我最初的目的,即将多行写入我上面提到的同一文本文件?我是否需要进行任何更改?
非常感谢你。
答案 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
部分。