2012-03-18 30 views
32

私は、サーバープログラムによって書き込まれているテキストファイルを監視しています。ファイルが変更されるたびに、コンテンツは自分のプログラム内のウィンドウに出力されます。別のプロセスで使用されているファイルを読み取る

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

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

良い方法がありますか?

以下の操作を行う必要がありますか?

  1. ファイル
  2. を監視することが一時コピーを削除し、一時コピー
  3. を読む
  4. を変更したとき、それの一時コピーを作成します。

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

答えて

67

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

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

+2

ありがとうございます...私は、この場合FileShare.Readが間違っているとは気づきませんでした。 –

+2

'FileShare.ReadWrite | FileShare.Delete'を使用すると、さらに多くのファイルにアクセスできます。 'FileShare.ReadWrite'が十分でないときに試してみる価値がある – Adassko

+0

@Adasskoあるいは' FileShare.Read'が十分でないとき、このケースでは、私の特定の状況で、同じ種類のコードでそれを使用していました。それを動作させるには 'FileShare.ReadWrite'に切り替える必要がありました。 – vapcguy

10

コール

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

これがある限り、他のアプリケーションがファイルを排他的にロックしていないとして動作するはずです。

+0

ありがとうございます。それはストリームリーダと組み合わせて使えますか?このように: File.Open(path、FileMode.Read、FileAccess.Read、FileShare.ReadWrite); StreamReader reader =新しいStreamReader(パス); – Christoffer

+0

@Tophe:もちろん。 IIRCでは、 'StreamReader' ctorもこれらのパラメータを直接取ることができます。 – SLaks

+0

どのように見えますか?私がFileMode.Open、FileAccess.Read、FileShare.ReadWriteをパラメータとしてStreamreaderに設定しても動作しません。それはいくつかのエンコーディングパラメータしか必要としないと言います。 – Christoffer

関連する問題