StreamWriter.WriteLine() не работает
Я пытаюсь записать несколько строк, по одной, в файл.txt, используя StreamWriter.WriteLine (не статично).
const string filename = "BasicTestInfo.txt";
using (var writer = new StreamWriter(filename, false))
{
writer.WriteLine("{0} 350 200 200 10 2 28 20 200 2500 1200 1 1", Player1);
writer.WriteLine("{0} 300 150 150 4 2 15 18 150 2500 1000 1 0", Player2);
writer.WriteLine("{0} 200 140 450 25 14 10 70 4500 2500 750 1 1", Player3);
writer.WriteLine("{0} 175 120 400 15 3 8 50 3000 2500 850 1 0", Player4);
writer.WriteLine("{0} 300 100 300 8 1 4 30 1000 2500 1200 1 0", Player5);
writer.WriteLine("{0} 450 310 450 20 5 5 35 1500 2500 700 1 1", Player6);
}
Каждый из объектов игрока является струнным. Если я запускаю это с другим именем файла (aka BasicTestInfo2.txt), он создает этот файл в bin.Debug, но он пуст. Я знаю, что достигну внутренней части блока using (я поместил туда Console.WriteLine), и я знаю, что хочу усечь, поэтому я использую false для добавления (хотя заменяю false на true или без параметра вообще не решает проблему).
Основная проблема заключается в том, что даже если файл создается, в нем нет строк текста.
4 ответа
Да, это правда, что в VB.net это (эксклюзивная очистка) не требовалось при настройках по умолчанию, но в C# вам необходим вызов Writer.Flush для принудительной записи. Конечно - Writer.Close() также принудительно выполнит сброс. В качестве альтернативы мы можем установить свойство AutoFlush экземпляра StreamWriter:
sw.AutoFlush = true;
// Gets or sets a value indicating whether the StreamWriter
// will flush its buffer to the underlying stream after every
// call to StreamWriter.Write.
От: http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush(v=vs.110).aspx
Заметьте, что: конструкция "с помощью" устранит исключительный флеш, но многие люди приземляются здесь только на основании предмета этого вопроса, и это самый низкий висячий фрукт, когда сталкивается с проблемой.
Показанный код выглядит хорошо.
Если бы мне пришлось угадывать, я бы заподозрил, что есть исключение (возможно, из хитроумного ToString
реализация на Player
Вы глотаете что-то.
Шаг через код, чтобы увидеть, что происходит, когда вы просматриваете каждый последующий WriteLine
и идет ли он до самого конца using
заблокировать без ошибок.
У меня была похожая проблема.
Я исправил это таким образом, просто поместил вашу строку в String.Format():
writer.WriteLine(String.Format("{0} 350 200 200 10 2 28 20 200 2500 1200 1 1", Player1));