2011-07-16 20 views
0

にマッチしたとき、私は現在、私の場合には、特定の文字列を探してテキストファイルを順番にできるようにしたいと思っています:「MP4:生産/サイクル、復帰真

文字列が一致している(ファイルは定期的に更新されるため、文字列は必ずしも最初に存在するとは限りません)、その行(テキストファイル内)をメッセージボックスなどに出力することができます。

達成され、どの例も認められるだろう。

答えて

1
while(true) { 
    Thread.Sleep(500); // lets get a break 
    if(!System.IO.File.Exists(FILE_NAME)) continue; 
    using (System.IO.StreamReader sr = System.IO.File.OpenText(FILE_NAME)) 
    { 
     string s = ""; 
     while ((s = sr.ReadLine()) != null) 
     { 
      if(s.Contains(TEXT_TO_SEARCH)) { 
       // output it 
      } 
     } 
    } 
} 
+0

ありがとう、しかしこれは何度も何度もファイルを検索し続けますか?例えばループのように? – James

+0

@James:Nope。ファイルを一度だけ読み込みます。 – Guffa

+0

@marcまた、エラーが発生しました:エラー '文字列'に 'contains'の定義がなく、 'string'型の最初の引数を受け入れる拡張メソッド 'contains'が見つかりませんでした – James

0

あなたはouldは、ファイルを繰り返しループして読み込む必要があります。

いくつかの他のプロセスが書き込みを行っているため、ファイルにアクセスできなくなる可能性があるので、エラー処理が必要であることに注意してください。

bool found = false; 
while (!found) { 
    try { 
    found = File.ReadAllText(fileName).Contains(searchString); 
    } catch (IOException) { 
    // I/O error, occurs if the file is being written. 
    // Nothing to do here, just wait and retry. 
    } 
    if (!found) { 
    Thread.Sleep(5000); 
    } 
} 

上記のコードは、ファイルがすべてメモリに読み込まれるようにかなり小さいと想定しています。ファイルが非常に大きい場合、メモリの例外を避けるために、それを小さな塊で読み取る必要があります。

コードは、各試行の間に5秒(5000ミリ秒)待機しています。具体的な状況、つまりファイルをチェックする頻度は、リスクを適度に抑えながら、ファイルを変更しようとしているプロセスを妨害する頻度に応じて調整する必要があります。

0

スリープを呼び出すことによってスレッドをブロックする場合は、最初に新しいスレッドを作成してファイルを読み込む必要があります。あなたはSystem.Threading.Timerを使うことができます:http://msdn.microsoft.com/en-us/library/swx5easy.aspx