File.WriteAllText を使用して非常に長い文字列をファイルに書き込んでいて、別のスレッドまたはプロセスが同じファイルを読み取ろうとしているとします。例外をスローしますか?つまり、File.WriteAllText メソッドが使用する FileShare パラメーターは何ですか? ドキュメントに書いてない!
3 に答える
これは、.netFramework4.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);
}
MSDNは、どの共有モードが使用されているかを文書化していません。
ソース コード (発行されたものまたは逆アセンブラーを介して) を確認するか、実行時にオプションを確認することができます (たとえば、プロセス モニターを使用して、WIN32 API フラグを値に変換しFileShare
ます)。
ただし、文書化されていないため、パッチまたは新しいバージョンによって変更される可能性があります。
あるいは、パラメーターFileStream
を受け取るオーバーロードの 1 つを使用して自分でファイルを開き、これに対して a を開き、テキストを書き込みます。FileShare
StreamWriter
例外をスローしますか?
はい。互換性のない共有モードでファイルが既に開かれている場合、開くことはできません。
例外をスローしますか?
はい。あるプロセスがファイルに書き込んでいる間は、lock
. たとえば、読み取りのためにファイルを開いてもすぐに例外をスローしないようにFileShare
パラメーターを設定したとしても、これらのリーダーはおそらく破損した結果になるため、お勧めできません。Read