サーバープログラムによって書き込まれているテキストファイルを監視しています。ファイルが変更されるたびに、コンテンツがプログラムのウィンドウに出力されます。
問題は、used by another process
であるため、ファイルでStreamreader
を使用できないことです。 Filestream
でReadWrite
を設定しても、ファイルを使用しているプロセスを制御できないため、何の効果もありません。
メモ帳でファイルを開くことができます。サーバーが使用している場合でもアクセスできる必要があります。
これを回避する良い方法はありますか?
次のことをすべきですか?
サーバーが変更するたびに、ファイル内のテキストを取得する必要があります。
メモ帳でファイルを読み取れる場合は、プログラムでもファイルに読み取りロックを設定していません。実行中の問題は、StreamReaderがFileShare.Readでファイルを開くことです。書き込みアクセスを拒否します。それは機能しません。他のプログラムはすでに書き込みアクセス権を取得しています。
次のようにStreamReaderを作成する必要があります。
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var sr = new StreamReader(fs, Encoding.Default)) {
// read the stream
//...
}
ここでエンコーディングを推測します。この種のコードには注意する必要があります。他のプログラムは積極的にファイルに書き込んでいます。信頼性の高いファイルの終わりの表示は取得できません。最後の行の一部を取得することは非常に可能です。特に、ファイルを読み続けてプログラムが追加したものを取得しようとすると面倒です。
コール
File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite)
これは、他のアプリケーションがファイルを排他的にロックしていない限り機能します。