Как записать в текстовый файл, пока приложение не будет закрыто - PullRequest
3 голосов
/ 13 февраля 2012

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

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

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

        Debug.WriteLine(jointHead.Position.X);

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

Спасибо ...

Ответы [ 5 ]

2 голосов
/ 13 февраля 2012

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

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

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

using (var fileWriter = new StreamWriter("test.txt", true))
{
    fileWriter.WriteLine(jointHead.Position.X);
}
1 голос
/ 13 февраля 2012

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

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

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

1 голос
/ 13 февраля 2012

Попробуйте

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 голосов
/ 13 февраля 2012

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

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


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

0 голосов
/ 13 февраля 2012

этот конструктор streamwriter удалит test.txt, если он уже существует.поэтому каждый раз, когда исполняется этот фрагмент кода, он удаляет созданный ранее файл text.txt.вместо этого используйте перегрузку для конструктора streamwriter , который добавляет дополнительный bool для добавления к существующему файлу test.txt вместо его замены:

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

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

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

...