2013-02-02 18 views
19

FileStreamStreamWriterを使って、.NET 4.5の既存のファイルにテキストを追加するときに何か面白かったです(古いフレームワークは試していません)。私は2つの方法を試しました。私は2つの違いが何であるか疑問に思っています。StreamWriterとFileStreamを使ってtxtファイルに書き込む

どちらの方法は、私はそれは、アプリケーションが完全にファイルを閉じていることを確認するための最良の方法だと個人的な経験を通じて発見したので、私はusing文で作成を持っているトップ

if (!File.Exists(filepath)) 
    using (File.Create(filepath)); 

に次のコードを含んでい。

非加工方法:このメソッドは何もして

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

私はかなりの検索に何を知らなくても、グーグルのビットをやった、と有益な何かを発見していません。それで、なぜ匿名のStreamWriterが(匿名ではないのですか?)StreamWriterが失敗するのはなぜですか?

+2

私は 'StreamWriter'がフラッシュされるまで何も実際に_write_しないと思います。' using'ブロックで暗黙的に呼び出される 'Dispose'メソッドは自動的にフラッシュします。編集:注: 'StreamWriter'には、[AutoFlush](http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx)プロパティがあります。このプロパティは、私が推測している記述を書くたびにストリームをフラッシュするのは、デフォルトで 'false'です。 –

+2

これは既に答えられていますが、なぜそのようなコードを書式設定する必要がありますか? IMOを読んで理解するのは面白いだけでなく、単純な書式設定エラーでバグが導入されるとリスクが増大します。私は中括弧の大ファンです - いつも! – TheCodeKing

+0

@TheCodeKing既に回答されている場合は、リンクを提供してもよろしいですか?私は正直にそれを探して、投稿する前にすべての提案された答えを見て、それは非常に(それは主に私の無名関数の使用のために)それに答えたものを見ませんでした。また、私はここでは、一部の文体や好みに基づいています。 IMOコードは実際には必要ではない中括弧で囲まれていますが、読みにくいです。 –

答えて

19

ですね。

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

は、あなたが「使用」ブロックを使用する場合、それは、StreamWriterの上で処分呼び出して、あなたの質問に答えるためにどのなければならないターンコールフラッシュインチ

+0

匿名の 'StreamWriter'にAutoFlushプロパティを設定するのは少し難しいですね。私が何かを逃していない限り。 –

+2

IDisposableを実装する型の匿名インスタンスを決して作成することは避けてください。 – xxbbcc

+2

AutoFlushを使用し、オブジェクトを破棄しないことをお勧めしません。対象物が使い捨てである場合は、それを廃棄する必要があります。 – dtb

7

2つのコードスニペットの違いは、usingの使用です。 The using statementは、オブジェクトをブロックの最後に配置します。

StreamWriterは、データを基になるストリームに書き込む前にバッファリングします。 StreamWriterを廃棄すると、バッファがフラッシュされます。バッファをフラッシュしないと、何も書き込まれません。

MSDNから:

あなたは、すべてのデータが正しく基本となるストリームに書き込まれることを保証するために、閉じる呼び出す必要があります。

も参照してください:あなたはストリームをフラッシュしていなかったようWhen should I use “using” blocks in C#?

+0

私は多かれ少なかれこれを前提としていたので苦痛ではありませんが、この情報をオンラインで見つけることのできる参考文献を追加することは可能でしょうか?これは私のものと同じくらい他の人にとって有益です。 –