2

「lotsofdata」という長い文字列を作成し、その内容を次のコードで出力するとします。

        string outputFilePath = @"C:\output.txt";
        System.IO.File.WriteAllText(outputFilePath, lotsofdata);

        SpecialFunction1();
        SpecialFunction2();
        SpecialFunction3();

私の質問は、コンピューターは、SpecialFunction1 の実行に移る前に、output.txt へのすべての書き込みを完全に終了するかということです。それとも、出力処理を開始し、出力処理が完了する前に SpecialFunction1 に移動しますか?

SpecialFunction1() に進む前に output.txt への書き込みが完了していることを確認したいのですが、これを確認する方法がわかりません。

4

4 に答える 4

8

簡単な答えはイエスです。

メソッドが終了する前に、基になるストリームが満たされ、閉じられます(重要な部分) 。WriteAllText

File.WriteAllText メソッド

新しいファイルを作成し、内容をファイルに書き込み、ファイルを閉じます。対象ファイルが既に存在する場合は上書きされます。

http://msdn.microsoft.com/en-us/library/system.io.file.writealltext%28v=vs.110%29.aspx

これは、すべてのファイル書き込みの黄金律ではありません。に直接書き込んでいる場合、続行する前にファイルが実際に書き込まれていることを確認したい場合は、必ずorFileStreamを呼び出す必要があります(理想的には、常に呼び出す必要があります)。FlushCloseClose

FileStream.Close メソッド

以前にバッファーに書き込まれたデータは、ファイル ストリームが閉じられる前にファイルにコピーされるため、Close を呼び出す前に Flush を呼び出す必要はありません。Close の呼び出しに続いて、ファイル ストリームに対するすべての操作で例外が発生する可能性があります。Close が一度呼び出されると、再度呼び出されても何もしません。

http://msdn.microsoft.com/en-us/library/aa328800%28v=vs.71%29.aspx

ここで重要なことは、ストリームをフラッシュする操作は、データが宛先に書き込まれるまで終了しないということです。

于 2013-10-31T15:15:25.330 に答える
6

はい、最初に提供されたコードでは、ファイルへのテキストの書き込みを終了し、その後でのみ他のSpecialFunction機能を実行します。

File.WriteAllTextドキュメントによると:

例外が発生した場合でも、ファイル ハンドルはこのメソッドによって閉じられることが保証されます。

そのため、大きなファイルでも同時 IO の問題は発生しません

于 2013-10-31T15:14:09.450 に答える
5

System.IO.File.WriteAllText完了すると、すべてのテキストがファイルシステム キャッシュにフラッシュされ、ドライブに遅延書き込みされます。

于 2013-10-31T15:20:19.493 に答える
1

すべてが同じスレッドで発生しているため、他のことが起こる前にファイルが書き込まれます。

于 2013-10-31T15:14:48.123 に答える