Добавлять строки в файл с помощью StreamWriter - PullRequest
156 голосов
/ 05 сентября 2011

Я хочу добавить строки в мой файл. Я использую StreamWriter:

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

Вывод моего файла должен быть на несколько строк ниже друг друга, но у меня есть только одна строка, которая перезаписывается каждый раз, когда я запускаю этот код.

Есть ли способ, позволяющий StreamWriter добавить к существующему файлу?

Ответы [ 10 ]

257 голосов
/ 05 сентября 2011

Используйте это вместо:

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

С этой перегрузкой конструктора StreamWriter вы выбираете, добавлять ли файл или перезаписывать его.

C # 4 и выше предлагает следующий синтаксис, который некоторые считают более читабельным:

new StreamWriter("c:\\file.txt", append: true);
141 голосов
/ 05 сентября 2011
 using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
 using (StreamWriter sw = new StreamWriter(fs))
 {
    sw.WriteLine(something);
 }
12 голосов
/ 05 сентября 2011

Я предполагаю, что вы выполняете все вышеуказанного кода каждый раз, когда что-то записываете в файл.Каждый раз, когда поток для файла открывается, его указатель поиска располагается в начале, поэтому все записи заканчиваются перезаписью того, что было раньше.

Вы можете решить проблему двумя способами: либо с помощью удобного * 1005.*

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

или путем явного перемещения указателя потока самостоятельно:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);
10 голосов
/ 05 сентября 2011

Попробуйте это:

StreamWriter file2 = new StreamWriter(@"c:\file.txt", true);
file2.WriteLine(someString);
file2.Close();
7 голосов
/ 05 сентября 2011

Заменить это:

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

на это:

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

true означает, что он добавляет текст.

5 голосов
/ 05 сентября 2011

Другой вариант - использование System.IO.File.AppendText

Это эквивалентно перегрузкам StreamWriter, предоставленным другими.

Также File.AppendAllText может дать немного более простой интерфейс, не беспокоясь об открытии и закрытии потока.Хотя, возможно, вам придется побеспокоиться о том, чтобы поставить свои собственные переводы строк.:)

5 голосов
/ 05 сентября 2011

Используйте этот StreamWriter конструктор со вторым параметром - true.

4 голосов
/ 12 мая 2015

На самом деле только ответ Джона (5 сентября '11 в 9:37) с BaseStream.Seek работал для моего случая.Спасибо Джон!Мне нужно было добавить строки в zip-архивированный текстовый файл.

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");
        }
    }
}
2 голосов
/ 30 декабря 2016

Еще один простой способ - использовать 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 голос
/ 22 декабря 2015

Замените эту строку:

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

этим кодом:

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

, а затем запишите свою строку в текстовый файл следующим образом:

sw.WriteLine("text content");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...