2013-03-02 29 views
2

Tester.txt中,它只是表示「你好」。寫入文件時保留現有文本

我現在運行這個命令:

Sub Main() 
    Dim fileName As String 
    Dim aFileStream As FileStream 
    Dim aWriter As StreamWriter 
    fileName = "...\Tester.txt" 
    Try 
     aFileStream = New FileStream(fileName, FileMode.OpenOrCreate) 
     aWriter = New StreamWriter(aFileStream) 
     aWriter.WriteLine("World") 
    Catch ex As Exception 
     MessageBox.Show("found this {0}", ex.Message) 
    Finally 
     If aWriter IsNot Nothing Then 
      aWriter.Close() 
     End If 
     If aFileStream IsNot Nothing Then 
      aFileStream.Close() 
     End If 
    End Try 

End Sub 

現在「你好」已與「世界」覆蓋。

我想保留在文件中現有的文本,所以我想我可以閱讀的文本到一個變量中,然後再寫入新的東西:

Sub Main() 
    Dim fileName As String 
    Dim aFileStream As FileStream 
    Dim aWriter As StreamWriter 
    Dim aReader As StreamReader 
    fileName = "...\Tester.txt" 
    Try 
     aFileStream = New FileStream(fileName, FileMode.OpenOrCreate) 

     aReader = New StreamReader(aFileStream) 
     Dim myContent As String = aReader.ReadToEnd() 

     aWriter = New StreamWriter(aFileStream) 
     aWriter.WriteLine("World") 

    Catch ex As Exception 
     MessageBox.Show("found this {0}", ex.Message) 
    Finally 
     If aWriter IsNot Nothing Then 
      aWriter.Close() 
     End If 
     If aReader IsNot Nothing Then 
      aReader.Close() 
     End If 
     If aFileStream IsNot Nothing Then 
      aFileStream.Close() 
     End If 
    End Try 

End Sub 

這是保留的標準方法文件已經在文件中?
我可以保留現有信息而不使用StreamReader的實例嗎?

回答

2

當然 - 你在找什麼叫做Append。例如,如果您更喜歡共享呼叫(不創建任何類的實例),則可以使用AppendAllText。或通過StreamWriter,通過this constructor。對於你的情況,你可以替換這片:與這一個

Dim fileName As String 
Dim aFileStream As FileStream 
Dim aWriter As StreamWriter 
fileName = "...\Tester.txt" 
Try 
    aFileStream = New FileStream(fileName, FileMode.OpenOrCreate) 
    aWriter = New StreamWriter(aFileStream) 
    aWriter.WriteLine("World") 

(請注意,我也壓縮你的代碼行數更少具有相同的結果):

Dim aWriter As StreamWriter 
Try 
    aWriter = New StreamWriter("...\Tester.txt", True) 
    aWriter.WriteLine("World") 

而且World將被追加到文件的結尾。如果該文件不存在,它將被創建,所以它已經包含幕後的FileMode.OpenOrCreate

使用AppendAllText,它變得更短:

IO.File.AppendAllText("...\Tester.txt", "World") 

作爲一個側面說明,你可以不用在你Finally塊稱之爲:

If aReader IsNot Nothing Then 
    aReader.Close() 
End If 

如果使用Using clause

Using aWriter As New StreamWriter("...\Tester.txt", True) 
    aWriter.WriteLine("World") 
End Using 

你仍然可以保留Try/Catch子句,但更好地更改它以捕獲文件特定的異常。例如,您可以使用IOException

+0

+1所有額外的幫助 - 儘管我已經知道的StreamWriter有一個重載的構造函數,我想明確地建立在我的代碼一個FileStream。 – whytheq 2013-03-03 17:54:42

+0

@whytheq:如果它回答你的問題,請考慮接受和/或upvoting它。 – Neolisk 2013-03-04 14:35:51

+0

[**這裏**](http://stackoverflow.com/users/1179880/whytheq?tab=questions)你可以看到我最終標記了所有我問的問題的答案 - 但我問了很多問題,喜歡延遲標記它們以防萬一任何人想要貢獻。 (你熱衷於達到5k分!) – whytheq 2013-03-04 14:55:48

1

一個正常的方式到達結束將是使用尋找。

aFileStream.Seek(0,SeekOrigin.End) 
0

爲什麼你需要使用流?你不能使用Io.File函數嗎? 他們真的很容易使用。 一些例子:

實施例1:

IO.File.WriteAllText("Text.txt", "Hello") 'This overwrite file content 

實施例2:

IO.File.AppendAllText("Text.txt", " World") 'This append file content 

實施例3:

Dim FileContent As String = IO.File.ReadAllText("Test.txt") 
FileContent &= vbNewLine & "Hi!" 
Io.File.WriteAllText("Text2.txt", FileContent) 

你可以事件讀/寫的字節與等效WriteAllBytes, ReadAllBytes ..

所有的功能都可以在這裏找到: File Methods

+0

你當然會指定文件的整個路徑;) – 2013-03-07 21:33:17

+0

如果目錄丟失,將使用當前工作目錄;) – Jamby 2013-03-08 08:11:38

+0

我明白你的觀點,但如果當前工作目錄恰好是程序目錄中的一個'%PROGRAMFILES%'的子目錄,那麼「普通」用戶將無法在那裏寫入。我認爲從長遠來看,編制這樣的問題纔不會出現問題。 – 2013-03-08 23:53:25