2011-07-24 9 views
12

File.WriteAllTextを使用して非常に長い文字列をファイルに書き込んでおり、別のスレッドまたはプロセスが同じファイルを読み込もうとしているとします。何か例外がスローされますか?つまり、File.WriteAllTextメソッドが使用するFileShareパラメータは何ですか?それはドキュメントに書かれていません!File.WriteAllTextとConcurrent Access

+0

[MSDN(http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx) –

+0

@Jalal MSDNファイル 'によって使用される共有モード文書化しません.WriteAllText'。 – CodesInChaos

+0

申し訳ありませんが、私はすぐに読んでいました。私は彼が 'FileShare'について質問していると思った。 –

答えて

9

これは.NET Framework 4.0のソースコードです。 FileShare.Readを内部的に使用するStreamWriterが使用されています。

[SecuritySafeCritical] 
public static void WriteAllText(string path, string contents) 
{ 
    if (path == null) 
    { 
     throw new ArgumentNullException("path"); 
    } 
    if (path.Length == 0) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); 
    } 
    InternalWriteAllText(path, contents, StreamWriter.UTF8NoBOM); 
} 


private static void InternalWriteAllText(string path, string contents, Encoding encoding) 
{ 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     writer.Write(contents); 
    } 
} 

これは、StreamWriterの基本ストリームを作成するコードです。

private static Stream CreateFile(string path, bool append) 
{ 
    return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan); 
} 
5

MSDNは、どの共有モードが使用されているかについては説明していません。

実行時に(例えば、Process Monitorを使用して、WIn32 APIフラグをFileShareの値に変換して)ソースコードを見るか、実行時にそのオプションを調べることができます。

しかし、と記載されていないため、これは変更される可能性があります。それは自分がFileShareパラメータを取りFileStreamオーバーロードのいずれかを使用してファイルを開く重要な場合

また、このオーバーStreamWriterを開き、テキストを書きます。

例外はありますか?

はい。ファイルがすでに互換性のない共有モードで開いている場合は、ファイルのオープンは失敗します。

+0

逆アセンブラを見ると、' File.WriteAllText'は 'FileShare.Read'を渡す' FileStreamn'を使います。 – Richard

+0

+1 "しかし、それは文書化されていないので、パッチや新しいバージョンがそれを変更する可能性があります。" – CodesInChaos

+0

逆アセンブルしたフレームワークのバージョンは? – Mehran

4

例外はありますか?

はい。あるプロセスがファイルに書き込んでいる間に、他のプロセスが読み取っていないことを確認する必要があります。lock。たとえFileShareパラメータをReadに設定しても、その後にファイルを開くことができ、すぐに例外をスローすることはできませんが、読者はおそらく破損した結果になる可能性があります。

+0

プロセス間ロックにはどのような種類のロックを使用しますか?通常の 'lock {/ * code * /}'ブロックは不十分であると思います。 –

関連する問題