如何监视txt文件并解析新行

时间:2012-04-23 15:24:35

标签: c# sql-server

嘿伙计们,我想知道是否有办法监视.txt文件而不锁定它并解析新附加的行以便发送到数据库。
我知道FileSystemWatcher将监视txt文件而不锁定它,并在发生更改时通知我。问题是它没有告诉已追加的数据行。我查看的所有示例都排除了显示新附加行或对新数据进行任何处理的部分。我的程序具有以下结构:

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. 然后我想解析这些数据并将其发送到数据库。
  3. 有谁知道如何最好地接近这个?或者有一个很好的教程?

2 个答案:

答案 0 :(得分:4)

您最好的选择是从文件系统观察程序触发的代码中跟踪正在读取文件的流中的Position。这是一些伪代码:

if(no stored position)
  start at beginning of file
else
{
  streamOfFile.Seek(storedPosition)
  read until end of file
  store stream.Postition
}

答案 1 :(得分:3)

这可以通过上次读取文件的长度来跟踪文件的长度,然后从下一次的那个点开始。但是,由于您可能在操作系统正在编写的同时从文件中读取数据,因此存在许多竞争条件。

您不能保证对文件的唯一更改是追加是您的更大问题吗?如果我在文件顶部插入一行,或者替换整个文件,会发生什么?