Как добавить текст в существующий текстовый файл - PullRequest
1 голос
/ 04 февраля 2012

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

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. Будет ли этот код соответствовать моей первоначальной цели записи нескольких строк в один и тот же текстовый файл, как я упоминал выше?Нужно ли вносить какие-либо изменения?

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2012

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) перезапишет файл (если он существует) или создаст новый файл (если он не существует).

Если вы все еще получаете исключение, убедитесь, что у вас нет файла, открытого в другом месте (как в Блокноте).

2 голосов
/ 04 февраля 2012

Очень удобным оператором 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.

...