Подтвердить что ты не робот

Запись в 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?

4b9b3361

Ответ 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, чтобы все данные были правильно записаны в базовый поток.

См. также: Когда следует использовать "использование" блоков в С#?