62

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

Streamreader問題は、ファイルがそのまま使用できないことused by another processです。ファイルを使用しているプロセスを制御できないため、 Filestreamwithを設定しても何の役にも立ちません。ReadWrite

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

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

次のことを行う必要がありますか?

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

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

4

2 に答える 2

138

メモ帳がファイルを読み取れる場合は、ファイルを読み取ることができます。明らかに、プログラムはファイルに読み取りロックを設定していません。あなたが直面している問題は、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
    //...
}

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

于 2012-03-18T17:58:47.547 に答える
14

使用する

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

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

于 2012-03-18T15:54:47.900 に答える