3

我想知道是否有一种方法可以在不锁定 .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. 然后我想解析这些数据并将其发送到数据库。

有谁知道如何最好地解决这个问题?或者有一个好的教程?

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

这可以通过在您上次阅读文件时跟踪文件的长度来完成,然后下次从该点开始。但是,由于您可能在操作系统写入的同时从文件中读取,因此存在很多竞争条件。

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

于 2012-04-23T15:46:46.427 回答