Запись в txt файл с StreamWriter и FileStream
Я столкнулся с чем-то интересным при использовании StreamWriter
с FileStream
для добавления текста в существующий файл в .NET 4.5 (не пробовал никаких старых фреймворков). Я пробовал два пути, один работал, а другой - нет. Мне интересно, какая разница между ними.
Оба метода содержали следующий код в верхней части
if (!File.Exists(filepath))
using (File.Create(filepath));
У меня есть создание в using
, потому что я нашел на собственном опыте, что это лучший способ убедиться, что приложение полностью закрывает файл.
Нерабочий метод:
using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write))
(new StreamWriter(f)).WriteLine("somestring");
С помощью этого метода ничто не добавляется к файлу.
Рабочий метод:
using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write))
using (StreamWriter s = new StreamWriter(f))
s.WriteLine("somestring");
Я сделал немного Googling, не зная, что искать, и не нашел ничего информативного. Итак, почему анонимный StreamWriter
не работает, где работает (не анонимный? Named?) StreamWriter
?
Ответы
Ответ 1
Похоже, что вы не сбросили поток.
http://msdn.microsoft.com/en-us/library/system.io.stream.flush.aspx
Похоже, StreamWriter записывает в буфер перед записью в конечный пункт назначения, в данном случае, с файлом. Вы также можете установить свойство AutoFlush и не скрывать его явно.
http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx
Чтобы ответить на ваш вопрос, когда вы используете блок "using", он вызывает dispose на StreamWriter, который должен, в свою очередь, вызвать Flush.
Ответ 2
Разница между двумя фрагментами кода заключается в использовании using
. Оператор using
размещает объект в конце блока.
A StreamWriter
буферизует данные перед записью в базовый поток. Утилизация StreamWriter
очищает буфер. Если вы не очищаете буфер, ничего не записывается.
Из MSDN:
Вы должны позвонить Close, чтобы все данные были правильно записаны в базовый поток.
См. также: Когда следует использовать "использование" блоков в С#?