3

.txt ファイルをロックせずに監視し、新しく追加された行を解析してデータベースに送信する方法があるかどうか疑問に思っています。

FileSystemWatchertxt ファイルをロックせずに監視し、変更が発生した場合は通知することを知っています。問題は、追加されたデータの行がわからないことです。私が見たすべての例は、新しく追加された行を表示したり、新しいデータを処理したりする部分を除外しています。私のプログラムの構造は次のとおりです。

static void Main(string[] args)
{
      
  //string line;

  //createWatcher (FileSystemWatcher)
  foreach (string line in getLines(@"C://Documents/log.txt"))
  {
    string teststring = line;         
    string[] parts = line.Split(' ', ',', '-', '>', '[', ']');
    StringBuilder builder = new StringBuilder();
            
    foreach (string h in parts)
    {
      builder.Append(h).Append(" ");
    }

    string result = builder.ToString();
    string cleanedString = System.Text.RegularExpressions.Regex.Replace(result, @"\s+", " ");
    string trimString = cleanedString.Trim();
    trimString = trimString.Remove(trimString.Length - 7);

    //Console.WriteLine(trimString);

    //Process new lines (parse/split)
    //Connect and send to database
  }
}

したがって、私の目的は、.txt ファイルをロックせずに監視することです。

  1. 既存のデータについてこのファイルを読み取り、追加されたデータを待ちます。
  2. 次に、このデータを解析してデータベースに送信します。

これに最もよくアプローチする方法を知っている人はいますか?または良いチュートリアルがありますか?

4

2 に答える 2

4

最善の策は、ファイルシステムウォッチャーから起動されたコードが、ファイルをPosition読み取っているストリーム内のを追跡することです。ここにいくつかの擬似コードがあります:

if(no stored position)
  start at beginning of file
else
{
  streamOfFile.Seek(storedPosition)
  read until end of file
  store stream.Postition
}
于 2012-04-23T15:35:45.980 に答える
3

これは、最後にファイルを読み取ったときにファイルの長さを追跡し、次回はその時点から開始することで実行できます。ただし、OS の書き込みと同時にファイルから読み取る可能性があるため、これには多くの競合状態があります。

ファイルへの唯一の変更が追加であることを保証できないことは、より大きな問題ではありませんか? ファイルの先頭に行を挿入したり、全体を置き換えたりするとどうなりますか?

于 2012-04-23T15:46:46.427 に答える