2011-09-05 140 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"); 
} 
相关问题