プロセスがログファイルを読み込もうとしているのに、NLogによって現在開いているファイル共有の問題があります。問題を診断する際に、私は驚くべきことを見つけました。次は失敗します。ファイル共有が期待通りに機能しない
using (var fileStream1 = new FileStream("test.file", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fileStream2 = new FileStream("test.file", FileMode.Open, FileAccess.Read, FileShare.Read))
{
}
を二FileStream
コンストラクタ呼び出しがで失敗します。
System.IO.IOException was unhandled
Message=The process cannot access the file 'c:\...\test.file' because it is being used by another process.
Source=mscorlib
StackTrace:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
これは最初のFileStream
は読書を共有する意思を示したという事実にもかかわらずです。
using (var fileStream1 = new FileStream("test.file", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fileStream2 = new FileStream("test.file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
}
あの、はい、第二の流れは、実際に問題を迂回開くときよりアクセスを要求している:私はさらに驚くべき発見は、これが機能するということでした。私はそれがなぜそうであるかについて完全に困惑し、私が何かを誤解していると仮定することしかできません。私はAPIのドキュメントを読んだことがありますが、それは動作する方法とは逆に、これがどのように動作すべきかについての私の現在のメンタルモデルをサポートしています。ここで
はdocsからいくつかのサポート引用符です:
この列挙の典型的な使用は、2つのプロセス が同時に同じファイルから読み込むことができるかどうかを定義することです。たとえば、ファイルが で開かれていて、Readが指定されている場合、他のユーザーは のファイルを開くことができますが、書き込みはできません。
は、ここに別の宝石です:
次のFileStreamコンストラクタは、既存のファイルや助成金、他のユーザ(リード)へ は、読み取り専用アクセスを開きます。
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
誰もが、この動作上の任意の光を当てることができます。 .NET 4%Windows XPでこれをテストしています。
ありがとうございます。だから、この誤解は非常に流行していても、ドキュメントは間違っている/間違っている? –
2番目のストリームに 'FileShare.Write'を含めることを意味します。 – rookie1024