4

このサンプルコードを考えると:

1:   using (StreamWriter sw = new StreamWriter(@"C:\file.txt"))
2:   {
3:       sw.WriteLine(great_string);
4:   }
5:
6:   using (StreamReader sr = new StreamReader(@"C:\file.txt"))
7:   {
8:       sr.ReadToEnd();
9:   }

8行目で呼び出されたときにgreat_string3行目で書かれたものが存在しない可能性はありますか?あなたの平均的なCPUはあなたの平均的なHDDよりもはるかに高速に動作するので、それは可能だと私には思えますが、私は今日これをテストしており、これまでのところ、3行目に書かれた文字列はオンラインでファイルを読むときに常に存在します8.おそらく、すべてのデータがファイルに書き込まれるかファイルから読み取られるまで、ステートメントがストリームを閉じないので、私が求めているような状況を防ぐことができると思います。C:\file.txtStreamReader.ReadToEndusing

私はMSDNでStreamWriter.Closeメソッドについて読んでいますが、次のように記載されています。

すべてのデータが基になるストリームに正しく書き出されるようにするには、Closeを呼び出す必要があります。

ただし、データが基になるストリームにいつ書き出されるかはわかりません。

このテーマに関する情報を事前に感謝します。この質問に対する答えを検索しましたが、何も見つかりませんでした...検索する用語がよくわかりませんでした。

4

4 に答える 4

3

Closeを呼び出した後、データがHDDに物理的に存在しない可能性がありますが、システム(Windowsカーネル)はそのように見えます。そして重要なのは外観です。

書き込んだばかりのファイルから読み取る場合、WindowsはHDDに問い合わせるか、キャッシュからサービスを提供します。

そうでない場合、効果の順序は関数間、さらにはプロセス間で任意に変化する可能性があるため、信頼できるプログラムを作成することは困難です。それは混乱だろう。したがって、システムは逐次一貫性を保証します。

あなたがそれについて考えるならば:このシリアル化プロパティが存在しなかった場合、ファイルは同時に複数の内容を持つ可能性があります!初めてお読みになると、古い内容が表示されます。もう一度読んでみると、突然変化が現れるのがわかります。幸い、この種の動作は不可能です。

于 2012-11-10T23:17:34.843 に答える
2

おそらく、usingステートメントは、すべてのデータがファイルに書き込まれるかファイルから読み取られるまでストリームを閉じないため、私が求めているような状況を防ぐことができると思います。

うん、その通り。using()は、オブジェクトが完全に破棄されていることを確認します。usingステートメントの詳細については、http ://msdn.microsoft.com/en-us/library/yh598w02 (v = vs.80).aspx?ppud=4を参照してください。

とは言うものの、ファイルが閉じられる前に、そのデータはフラッシュされます。実際、ファイルが書き込まれるのを待ちます。

于 2012-11-10T23:13:18.773 に答える
1

alleywayjackの答えは正しいです。タイミングを見てください:

    static void Main()
    {
        var file = @"c:\temp\test.bin";
        String huge = new String(new char[20 * 1024 * 1024]);
        var sw = new Stopwatch();
        var sw2 = new Stopwatch();
        sw.Start();
        using (var stream = new StreamWriter(file))
        {
            sw2.Start();
            stream.Write(huge);
            sw2.Stop();
        }
        sw.Stop();
        sw2.Stop();

        Console.WriteLine("Write 20MB to cache: " + (sw.Elapsed.TotalMilliseconds - sw2.Elapsed.TotalMilliseconds));
        Console.WriteLine("Write 20MB from cache to HD: " + sw2.Elapsed.TotalMilliseconds);
    }

出力:

Write 20MB to cache: 5   // ms (including preparing the stream) 
Write 20MB from cache to HD: 186   // ms

手順全体がブロックされています(同期)。

于 2012-11-10T23:44:58.150 に答える
-1

代わりにフラッシュを使用する必要があります。これにより、データが確実に書き込まれます。

于 2012-11-10T23:12:40.710 に答える