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は、テキストファイル内にすでに含まれているコンテンツを読み、その最後に到達して新しい行を追加していました。ただし、別のプロセスによって使用されているため、プロセスはファイル'D:\test.txt'にアクセスできませんというメッセージとともにIOExceptionエラーが表示されます。を破棄および/または閉じた後でも役に立ちません。ここで何が欠けていますか?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の2番目のコンストラクターパラメーターとしての値StreamWriterは、それ自体でこれを行います。別の理由で既存のコンテンツを読む必要がない限り、StreamReaderパーツを完全に削除する必要があります。

于 2012-02-04T17:53:21.340 に答える