Добавлять строки в файл с помощью StreamWriter


170

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

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

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

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


19
Не забудьте избавиться StreamWriter. usingБлок лучше синтаксис для этого.
TheCodeKing

1
По этой же причине я предпочитаю не беспокоиться о потоках при выполнении очень быстрых обновлений файла с помощью File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Крис

@TheCodeKing - Можете ли вы показать мне код для этого?
Steam

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

Ответы:


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);

Что если файл имеет 10 МБ, и я начинаю запись с позиции 0, но только с 10 КБ, как я могу убедиться, что файл содержит только те данные 10 КБ, которые я только что написал?
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

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

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

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


5

На самом деле только ответ Джона (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");
        }
    }
}

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");
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.