2012-02-13 3 views
3

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

 StreamWriter fileWriter = new StreamWriter("test.txt"); 
     fileWriter.WriteLine(jointHead.Position.X);  
     fileWriter.Close(); 

Когда я пишу так:

 Debug.WriteLine(jointHead.Position.X); 

пишет позицию X, пока не будет закрыто. Как я могу написать текстовый файл, как я пишу в режиме отладки, пока я не закрою приложение. Если я возьму файлWrite.Close(), с которого он останется, программа не работает.

Спасибо ...

+0

просто измените соответствующую строку на: StreamWriter fileWriter = новый StreamWriter ("test.txt", true); добавить к файлу. – FooLman

+0

Ваша цель добавить текст, если приложение не закончится и не записать его на диск? – Oybek

ответ

1

Попробуйте

StreamWriter fileWriter = new StreamWriter("test.txt", true); 
     fileWriter.WriteLine(jointHead.Position.X);  
     fileWriter.Close(); 

Это позволит текст, написанный, который будет добавлен в конец файла. На данный момент вы пишете с самого начала каждый раз.

редактировать

Если вы хотите, чтобы очистить файл на старте приложения, то просто выполните следующие действия:

StreamWriter fileWriter = new StreamWriter("test.txt"); 
      fileWriter.Write(""); 
      fileWriter.Close(); 
+0

спасибо, это сработало, но он не пишет. Есть ли способ переписать каждый раз, когда я запускаю приложение? – Samet

+0

Добавлен способ очистки файла - по существу, перезапишите файл нулевым символом и сохраните его. – ChrisBD

+0

Я не понимал. Я буду использовать оба одновременно? Я имею в виду, что EDIT verison будет в начале приложения, которое я ничего не спасу. Первая часть кода будет в том месте, где я хочу сохранить? – Samet

0

, что конструктор StreamWriter удалит test.txt, если она уже существует. поэтому каждый раз, когда бит кода запускается, он удаляет файл text.txt, который он создал ранее. вместо этого использовать overload for the constructor of streamwriter, который принимает дополнительный BOOL для добавления к существующему test.txt файл вместо замены его:

StreamWriter fileWriter = new StreamWriter("test.txt", true); 

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

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

2

Из вашего описания я предполагаю, что приведенные ниже фрагменты кода находятся в цикле.

Вероятно, вы получите лучшую производительность, перемещая файл открытым/закрытым за пределами цикла (который также вылечит вашу проблему).

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

using (var fileWriter = new StreamWriter("test.txt", true)) 
{ 
    fileWriter.WriteLine(jointHead.Position.X); 
} 
0

Держите русскую ленту открытой. Но позвоните по телефону Flush после звонка WriteLine.

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


Возможно, вы также захотите изучить существующую структуру ведения журнала. Существует много существующих, нет необходимости изобретать велосипед. Лично я бы использовал Common.Logging с бэкэндом по вашему выбору.

1

Я предпочел бы предложить вам использовать какой-то регистратор с stringbuilder.

public class Logger { 
    private StringBuilder sb; 
    public Logger() { 
     sb = new StringBuilder(); 
    } 
    public Log(String log) { 
     sb.Append(log).AppendLine(); 
    } 
    public void Flush() { 
     File.WriteAllText(String.Format(@"D:\Logs\Log at {0:yyyy-MM-dd HH:mm:ss}.txt", DateTime.Now), sb.ToString()); 
     sb.Clear(); 
    } 
} 

Этот класс является гораздо более изящным и многоразовым решением. Это действительно приемлемо, если ваш целевой журнал не очень большой.

Смежные вопросы