Добавление строк в файл с помощью StreamWriter
Я хочу добавить строки в свой файл. Я использую StreamWriter:
StreamWriter file2 = new StreamWriter(@"c:file.txt");
file2.WriteLine(someString);
file2.Close();
вывод моего файла должен быть на несколько строк ниже друг друга, но у меня есть только одна строка, которая перезаписывается каждый раз, когда я запускаю этот код.
есть ли способ разрешить StreamWriter добавлять к существующему файлу?
10 ответов
используйте этот код:
new StreamWriter("c:\file.txt", true);
С этой перегрузкой конструктора StreamWriter вы выбираете, добавляете ли вы файл или перезаписываете его.
C# 4 и выше предлагает следующий синтаксис, который некоторые находят более читаемым:
new StreamWriter("c:\file.txt", append: true);
using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(something);
}
Я предполагаю, что вы выполняете все в приведенном выше коде каждый раз, когда вы пишете что-то в файл. Каждый раз, когда поток для файла открывается, его указатель поиска расположен в начале, поэтому все записи заканчиваются перезаписью того, что было раньше.
Вы можете решить проблему двумя способами: либо с удобным
file2 = new StreamWriter("c:/file.txt", true);
или явно переместив указатель потока самостоятельно:
file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);
попробуйте это:
StreamWriter file2 = new StreamWriter(@"c:\file.txt", true);
file2.WriteLine(someString);
file2.Close();
заменить:
StreamWriter file2 = new StreamWriter("c:/file.txt");
С этого:
StreamWriter file2 = new StreamWriter("c:/file.txt", true);
true
указывает на то, что он добавляет текст.
использовать этой StreamWriter
конструктор со 2-м параметром -true
.
другой вариант использует Система.ИО.Файл.AppendText
Это эквивалентно перегрузкам StreamWriter, которые дали другие.
и .AppendAllText может дать немного более простой интерфейс, не беспокоясь об открытии и закрытии потока. Хотя вам, возможно, придется беспокоиться о том, чтобы поставить свои собственные linebreaks. :)
на самом деле только ответ Джона (Сентябрь 5 '11 в 9:37) С BaseStream.Сик работал над моим делом. Спасибо, Джон! Мне нужно добавить строки в 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");
}
}
}
еще один простой способ-это использовать 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");
}
замените эту строку:
StreamWriter sw = new StreamWriter("c:/file.txt");
этот код:
StreamWriter sw = File.AppendText("c:/file.txt");
а затем напишите свою строку в текстовый файл следующим образом:
sw.WriteLine("text content");