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

Каждый из объектов игрока является строковой константой. Если я запускаю это с другим именем файла (он же BasicTestInfo2.txt), он создает этот файл в bin.Debug, но он пуст. Я знаю, что достигну внутренней части используемого блока (я поместил туда Console.WriteLine), и я знаю, что хочу усечь, поэтому я использую false для добавления (хотя заменяя false на true или без параметра никак не решает проблему).

Основная проблема заключается в том, что даже если файл создается, в нем нет строк текста.


person Brandon Gross    schedule 23.12.2012    source источник
comment
Я скопировал ваш код в свежее консольное приложение - и он отлично работает. Может быть, вы очистите этот файл после этого?   -  person JleruOHeP    schedule 23.12.2012
comment
Используйте полные пути к файлу. Так что не basictestinfo2.txt, а c:\foo\bar\basictestinfo2.txt. Это гарантирует, что вы всегда сможете найти файл там, где вы ожидаете. Не забудьте использовать Environment.GetFolderPath(), чтобы получить надежное имя папки для записи.   -  person Hans Passant    schedule 23.12.2012
comment
Есть ли у предыдущего сеанса отладки открытая блокировка этого файла?   -  person Jason Whitted    schedule 23.12.2012
comment
Возможно, вы захотите добавить write.Flish() в конец вашего блока использования, чтобы убедиться, что содержимое потока действительно записывается в файл.   -  person Mithrandir    schedule 23.12.2012
comment
@JleruOHeP Что означает очистить файл?   -  person Brandon Gross    schedule 23.12.2012
comment
@Hans Passant Его нужно запускать в других средах, поэтому я попробую GetFolderPath (), но опять же, файлы отображаются в том же каталоге, когда я пробую новое имя файла.   -  person Brandon Gross    schedule 23.12.2012
comment
@Mithrandir Я считаю, что использование блока делает функцию Flush() ненужной, потому что, когда поток закрывается, поток сбрасывается. Тем не менее, я попытался добавить write.Flush() в конец блока, и это не решило проблему.   -  person Brandon Gross    schedule 23.12.2012
comment
Я имел в виду, например, что у вас есть File.Create(filename); где-то позже... Можете ли вы добавить точку останова в следующем операторе после использования блока и проверить содержимое файла?   -  person JleruOHeP    schedule 23.12.2012


Ответы (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

Обратите внимание: конструкция «использование» позволит избежать эксклюзивного сброса, но многие люди приземляются здесь только на основе предмета этого вопроса, и это самый низкий висящий плод, когда они сталкиваются с проблемой.

person shivesh suman    schedule 21.03.2014
comment
Это правильно, но не решает вопрос; метод Dispose() в StreamWriter вызовет Flush(), а приведенный выше код удалит средство записи в конце блока using. - person Bringer128; 02.07.2015
comment
Этот ответ должен быть неправильным. При удалении модуля записи все содержимое сбрасывается. - person usr; 17.10.2017
comment
Настройка MyStreamWriter.AutoFlush = true; помогла мне. - person Jim Fell; 25.05.2018

закрыть писателя

писатель.close();

Это сработало для меня.

person will    schedule 21.06.2013
comment
using закроет средство записи. Вам нужно будет сделать это явно только в том случае, если у вас нет его внутри using. - person Servy; 21.06.2013

Показанный код выглядит нормально.

Если бы мне пришлось угадывать, я бы заподозрил, что существует исключение (возможно, из-за хитроумной реализации ToString на Player), которое вы где-то проглатываете.

Пройдитесь по коду, чтобы увидеть, что происходит, когда вы проходите каждый последующий блок WriteLine, и проходит ли он весь путь до конца блока using без ошибок.

person Marc Gravell    schedule 23.12.2012
comment
Спасибо за помощь! Я обнаружил свою проблему. Поскольку я хочу перезаписывать файл каждый раз, когда я пишу в него, а не добавлять его, я создавал свой FileStream с помощью FileMode.Truncate (прежде чем я переключился на прямое использование конструктора StreamWriter). Теперь из-за этого я обращался к файлу с помощью StreamReader, созданного с помощью Truncate. Таким образом, когда я открывал файл для чтения, я удалял его полностью. После замены на FileMode.OpenOrCreate файл не разрывается при открытии и тест проходит. Таким образом, мы видим, что проблема была не в написании, а в чтении. - person Brandon Gross; 24.12.2012

У меня была похожая проблема.

Я исправил это таким образом, просто поместите вашу строку в String.Format():

writer.WriteLine(String.Format("{0} 350 200 200 10 2 28 20 200 2500 1200 1 1", Player1));
person Qeeet    schedule 25.01.2016