2011-08-10 15 views
7

特定のパターンを検出するためにログファイルを継続的に読み取る必要があります。ログライターの操作で実行する必要があるファイル操作を妨げずに、どうすればできますか?他のプロセスの変更を防ぐことができないような方法でファイルを読む

ログ作成プロセスは、ログを作成するだけでなく、ファイルを定期的に別の場所に移動します(一定のサイズに達する)。

ファイルの読み方では、ログライターアプリはファイルを移動できません。私はさまざまなFileShareオプションを使って無駄に遊んだ。ここで

は私のコードのバージョンを簡略化されています:

using (FileStream stream = new FileStream(@"C:\temp\in.txt", FileMode.Open, FileAccess.Read, FileShare.Delete)) 
     { 
      TextReader tr = new StreamReader(stream); 
      while (true) 
      { 

       Console.WriteLine(".. " + tr.ReadLine()); 
       Thread.Sleep(1000); 
      } 

     } 
+0

"ログライターアプリはファイルを移動できません" - 移動しているファイルにリーダーを開いたままにしますか? –

+0

ファイルが利用可能である限り、私は読書を続けたいと思います。私は、ロギングアプリケーションがファイルをいつ/どのように移動するかについて、何も制御できません。理想的には、ファイルが移動されたときに例外が発生し、その時点から新しいログファイルを読み始めることになります。 – akirekadu

答えて

3

お試しFileShare.ReadWrite | FileShare.Delete

ファイルが削除(移動)されていると、読み込みに失敗すると思います。

+0

ありがとうございます。これはまさに私が探していたものです。 – akirekadu

3

あなたが読むために変更がある場合だけでなく、すべての時間を開いてファイルを維持しています。

私はより良いアプローチは、FileSystemWatcherを使用してファイルを監視し、変更して新しいデータを読み込むときにファイルを開くことだと思います。ファイルが添付されている場合は、ファイルを処理した時間を追跡し、ファイルを開いたときにすぐにその位置に移動することができます。

+0

これが適度に(または重く)使用されているログファイル(これはおそらく疑わしい)である場合、これは常にトリガーされます。このファイルが1000行/秒で書かれているとしましょう... – Joe

+0

@anders次に、読者が読んだときにライターがそのファイルを移動したいという同じ問題があります。 – Skomski

+0

ジョーのように、これはログファイルであり、常に更新されます。 – akirekadu