使用StreamWriter将行附加到文件


170

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

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

我的文件的输出应该是彼此下面的几个字符串,但是我只有一行,每次运行此代码时,该行都会被覆盖。

有什么方法可以让StreamWriter追加到现有文件吗?


19
不要忘记处置StreamWriter。一个using块是为了这个美好的语法。
TheCodeKing 2011年

1
这也是为什么我不喜欢有关信息流的担心使用File.AppendAllText做得非常快速更新文件的时候- msdn.microsoft.com/en-us/library/ms143356.aspx
克里斯-

@TheCodeKing-您能告诉我一些代码吗?
2013年

4
@blastousing (var stream = new StreamWriter(..)) { stream.WriteLine(..); }
TheCodeKing

Answers:


279

改用这个:

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

通过StreamWriter构造函数的此重载,您可以选择是附加文件还是覆盖文件。

C#4及更高版本提供以下语法,有些语法更易读:

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


13

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

您可以通过两种方式解决问题:

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

或通过自己显式重新定位流指针:

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

如果文件有10mb并且我从位置0开始写入,但只有10kb,该怎么办?如何确保文件包含我刚刚写入的10kb数据?
JobaDiniz

10

试试这个:

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

7

替换为:

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

有了这个:

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

true 指示它附加文本。




5

实际上,只有Jon对BaseStream.Seek的回答(11年5月11日9:37)适用于我的情况。谢谢乔恩!我需要在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");
        }
    }
}

3

一种更简单的方法是使用,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");
}

1

替换此行:

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

使用此代码:

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

然后将您的代码行写入文本文件,如下所示:

sw.WriteLine("text content");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.