Додайте рядки до файлу за допомогою 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 - Чи можете ви показати мені якийсь код, щоб це зробити?
Пара

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

що , якщо файл має 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

Інший варіант - використання System.IO.File.AppendText

Це еквівалентно перевантаженню StreamWriter, який надали інші.

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


5

Насправді лише відповідь Йона (5 вересня 1111 о 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.