4

C# で番号の長いリストをファイルに書き込もうとしていますが、リストが終わる前に停止し続けます。たとえば、次のコード:

  System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt");

        for (int i = 0; i < 500; i++)
        {
            file.WriteLine(i);
        }

0 から 431 までの数値をリストしたテキスト ファイルが残ります。500 を 1000 に変更すると、0 から 840 になります。ループが終了する前に、常に書き込みが停止するようです。ファイルだけでなくコンソールにも数字を出力すると、コンソールに完全なリストが表示されますが、ファイルには表示されません。

4

3 に答える 3

14

プログラムを終了する前にライターを閉じて、バッファリングされたすべての出力がファイルに書き込まれるようにする必要があります。

これを行う非常に便利な方法の 1 つは、ステートメントを使用することです。これにより、ループが完了するとusing、 が確実に閉じられます。StreamWriter

using (System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt"))
{
    for (int i = 0; i < 500; i++)
    {
        file.WriteLine(i);
    }
}
于 2013-10-06T12:26:08.450 に答える
4

StreamWriter が出力に 4096 バイトの長さのバッファーを使用することを発見しました。このバッファは、オペレーティング システムの WriteFile() 関数に対する呼び出しの数を減らし、より効率的にするのに役立ちます。バッファの内容がファイルに確実に届くようにするには、Flush() メソッドを呼び出すか、Close() または Dispose() でストリームを閉じる必要があります。

ファイルを開いたままにしておくことが確実な場合は、次のコード行を追加して、書き込み時に出力を確認できるようにすることができます。

    file.AutoFlush = true;

ファイルの場合、AutoFlush プロパティはデフォルトでfalseです。Console.Write/Line() の出力をすぐに確認できるのはコンソールにも当てはまります。また、コンソール出力が非常に遅い理由の 1 つです。

しかし、ファイル変数がローカル変数であることを考えると、ほぼ確実にファイルを閉じたいと思うでしょう。usingステートメントを使用して、このコードを含むメソッドが返されるまでに処理が行われるようにします。これを忘れると、少なくとも次のガベージ コレクションまで、ファイルがしばらく開いたままになります。

于 2013-10-06T13:18:33.637 に答える