web-dev-qa-db-ja.com

別のプロセスが使用するファイルの読み取り

サーバープログラムによって書き込まれているテキストファイルを監視しています。ファイルが変更されるたびに、コンテンツがプログラムのウィンドウに出力されます。

問題は、used by another processであるため、ファイルでStreamreaderを使用できないことです。 FilestreamReadWriteを設定しても、ファイルを使用しているプロセスを制御できないため、何の効果もありません。

メモ帳でファイルを開くことができます。サーバーが使用している場合でもアクセスできる必要があります。

これを回避する良い方法はありますか?

次のことをすべきですか?

  1. ファイルを監視する
  2. 変更時に一時コピーを作成する
  3. 一時コピーを読む
  4. 一時コピーを削除します。

サーバーが変更するたびに、ファイル内のテキストを取得する必要があります。

45
Christoffer

メモ帳でファイルを読み取れる場合は、プログラムでもファイルに読み取りロックを設定していません。実行中の問題は、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
    //...
}

ここでエンコーディングを推測します。この種のコードには注意する必要があります。他のプログラムは積極的にファイルに書き込んでいます。信頼性の高いファイルの終わりの表示は取得できません。最後の行の一部を取得することは非常に可能です。特に、ファイルを読み続けてプログラムが追加したものを取得しようとすると面倒です。

96
Hans Passant

コール

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite)

これは、他のアプリケーションがファイルを排他的にロックしていない限り機能します。

13
SLaks