2011-09-05 93 views
128

我想將行附加到我的文件。我使用一個StreamWriter:使用StreamWriter將行添加到文件

StreamWriter file2 = new StreamWriter(@"c:\file.txt"); 
file2.WriteLine(someString); 
file2.Close(); 

我的文件的輸出應低於對方几個字符串,但我只有一排,這是覆蓋每次運行該代碼的時間。

有什麼方法讓StreamWriter追加到現有的文件?

+15

不要忘記處置'StreamWriter'。 「使用」塊對此更好。 – TheCodeKing

+1

這也是爲什麼我更喜歡在使用File.AppendAllText快速更新文件時不擔心流的問題 - http://msdn.microsoft.com/zh-cn/library/ms143356.aspx – Chris

+0

@TheCodeKing - Can你給我看一些代碼來做到這一點? – Steam

回答

213

使用這個代替:

new StreamWriter("c:\\file.txt", true); 

在這種超負荷的StreamWriter構造函數的選擇,如果你追加的文件,或覆蓋它。

C#4和以上提供下列語法,其中一些找到更易讀:

new StreamWriter("c:\\file.txt", append: true); 
7

替換此:

StreamWriter file2 = new StreamWriter("c:/file.txt"); 

與此:

StreamWriter file2 = new StreamWriter("c:/file.txt", true); 

true指示它追加文本。

129
using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write)) 
using (StreamWriter sw = new StreamWriter(fs)) 
{ 
    sw.WriteLine(something); 
} 
8

試試這個:

StreamWriter file2 = new StreamWriter(@"c:\file.txt", true); 
file2.WriteLine(someString); 
file2.Close(); 
10

我假設你正在執行上面的代碼中的每一個你寫的東西到文件時間所有。每次打開文件流時,其查找指針都位於開頭,因此所有寫入操作最終會覆蓋之前的文件。

您可以通過兩種方式解決這個問題:要麼與便利

file2 = new StreamWriter("c:/file.txt", true); 

或通過顯式重新定位流指針自己:

file2 = new StreamWriter("c:/file.txt"); 
file2.BaseStream.Seek(0, SeekOrigin.End); 
+0

如果文件有10MB並且我從位置0開始寫入,但只有10kb,如何確保文件* only *包含我剛剛寫入的10kb數據? – JobaDiniz

5

另一種選擇是使用System.IO.File.AppendText

這相當於其他人給出的StreamWriter重載。

另外File.AppendAllText可能會給一個稍微簡單的接口,而不必擔心打開和關閉流。儘管你可能需要擔心自己的換線問題。 :)

4

其實只有喬恩的答案(9月5 '11在9:37)與BaseStream.Seek工作我的情況。謝謝喬恩!我需要附加行到一個zip存檔的txt文件。

using (FileStream zipFS = new FileStream(@"c:\Temp\SFImport\test.zip",FileMode.OpenOrCreate)) 
{ 
    using (ZipArchive arch = new ZipArchive(zipFS,ZipArchiveMode.Update)) 
    { 
     ZipArchiveEntry entry = arch.GetEntry("testfile.txt"); 
     if (entry == null) 
     { 
      entry = arch.CreateEntry("testfile.txt"); 
     } 
     using (StreamWriter sw = new StreamWriter(entry.Open())) 
     { 
      sw.BaseStream.Seek(0,SeekOrigin.End); 
      sw.WriteLine("text content"); 
     } 
    } 
} 
1

替換此行:

StreamWriter sw = new StreamWriter("c:/file.txt"); 

與此代碼:

StreamWriter sw = File.AppendText("c:/file.txt"); 

,然後寫您的線路以文本文件是這樣的:

sw.WriteLine("text content"); 
2

還有一簡單的方法是使用File.AppendText其追加UTF-8編碼的文本到一個現有的文件,或到一個新的文件,如果指定的文件不存在,並返回一個System.IO.StreamWriter

using (System.IO.StreamWriter sw = System.IO.File.AppendText(logFilePath + "log.txt")) 
{             
    sw.WriteLine("this is a log"); 
}