C# 使用StreamWriter向文件追加行

C# 使用StreamWriter向文件追加行,c#,streamwriter,C#,Streamwriter,我想在我的文件中添加行。我正在使用StreamWriter: StreamWriter file2 = new StreamWriter(@"c:\file.txt"); file2.WriteLine(someString); file2.Close(); 我的文件的输出应该是相互下方的几个字符串,但我只有一行,每次运行此代码时都会覆盖这一行 有没有办法让StreamWriter附加到现有文件中?改用以下方法: new StreamWriter("c:\\file.txt", true);

我想在我的文件中添加行。我正在使用StreamWriter:

StreamWriter file2 = new StreamWriter(@"c:\file.txt");
file2.WriteLine(someString);
file2.Close();
我的文件的输出应该是相互下方的几个字符串,但我只有一行,每次运行此代码时都会覆盖这一行

有没有办法让StreamWriter附加到现有文件中?

改用以下方法:

new StreamWriter("c:\\file.txt", true);
使用StreamWriter构造函数的此重载,您可以选择是追加文件还是覆盖文件

C#4及以上版本提供了以下语法,有些人认为更具可读性:

new StreamWriter("c:\\file.txt", append: true);
替换此项:

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

StreamWriter file2 = new StreamWriter("c:/file.txt", true);
true
表示它附加文本。

与第二个参数一起使用-
true

尝试以下操作:

 using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
 using (StreamWriter sw = new StreamWriter(fs))
 {
    sw.WriteLine(something);
 }
StreamWriter file2 = new StreamWriter(@"c:\file.txt", true);
file2.WriteLine(someString);
file2.Close();

我假设您每次向文件写入内容时都在执行上述所有代码。每次打开文件的流时,其seek指针都位于开头,因此所有写入操作都会覆盖以前的内容

你可以用两种方法解决这个问题:一种是用方便的方法

file2 = new StreamWriter("c:/file.txt", true);
或者自己显式重新定位流指针:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);
另一个选择是使用

这相当于其他人给出的StreamWriter重载


还可以提供一个稍微简单的界面,而不必担心打开和关闭流。尽管您可能需要担心自己的换行符。:)

实际上只有Jon的答案(2011年9月5日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");
        }
    }
}
替换此行:

StreamWriter sw = new StreamWriter("c:/file.txt");
使用此代码:

StreamWriter sw = File.AppendText("c:/file.txt");
然后将行写入文本文件,如下所示:

sw.WriteLine("text content");

一种更简单的方法是使用
文件.AppendText
它将UTF-8编码的文本追加到现有文件中,如果指定的文件不存在,则追加到新文件中,并返回
System.IO.StreamWriter

using (System.IO.StreamWriter sw = System.IO.File.AppendText(logFilePath + "log.txt"))
{                                                
    sw.WriteLine("this is a log");
}
你可以这样用

 using (System.IO.StreamWriter file =new System.IO.StreamWriter(FilePath,true))
             {
                    
                    
            `file.Write("SOme Text TO Write" + Environment.NewLine);         
                    
             }
        

不要忘记处理
StreamWriter
。使用
块是更好的语法。这也是为什么在使用file.AppendAllText-@TheCodeKing-对文件进行快速更新时,我不喜欢担心流的原因。你能给我看一些代码吗?@blato
使用(var stream=newstreamwriter(..){stream WriteLine(..);}
如果文件有10mb,我从位置0开始写入,但只有10kb,我如何确保文件只包含我刚刚写入的10kb数据?