通过Filesystemwatcher或其他内容,有可能仅检索正在观看的文本/日志文件的新条目



我有一个文件夹,我在查看 FileSystemWatcher的任何日志文件的内容,即在特定目录中观看 *.log。我现在意识到FileSystemWatcher是相当有限的,并且只能根据更改启动事件,但是它不会返回或知道进行了哪些更改。是否有一个可以控制在某个地方的库或我应该使用的其他图书馆?

当我检测到此DNS日志的更改时,我想获取已添加到文件末尾的新条目。我什至无法从StreamReader那里获得线号,我认为这可能会有所帮助。我有什么选择?

您有几个选项。在每个更改上阅读整个文件,并且每次将新行与以前的线路进行比较。如果文件太大,则将其过高。如果仅通过将文本附加到末尾来更改您的文件,那么您可以第一次读取文件,然后可以保持线路计数,并且在每一个更改中,您都可以跳过以前的行并获取新行。并更新计数器。例如:

private static int counter;
private static string[] currentLines;
private static void Main(string[] args)
{
    FileSystemWatcher watcher = new FileSystemWatcher("myfile.txt");
    watcher.Changed += fileChanged;
    currentLines = File.ReadLines("myFile.txt").ToArray();
    counter = currentLines.Length;
    Console.ReadLine();
}
private static void fileChanged(object sender, FileSystemEventArgs e)
{
     var temp = File.ReadLines("myFile.txt").Skip(counter).ToArray();
     if (temp.Any())
     {
         currentLines = temp;
         counter += temp.Length;
     }
}

正确的解决方案是采用文件系统过滤器驱动程序并拦截文件写操作,从而使数据在(甚至之前)之后立即写入文件。

您可以自己编写文件系统驱动程序(这很棘手),也可以使用我们的callbackFilter库,其中包括一个现成的驱动程序。

同样,如果在检测更改或以允许阅读的模式打开时未打开文件,则可以从其答案中描述的SELMAN22读取已知数据。请注意,读取文本行是一个坏主意 - 相反,您需要将书面数据读取为二进制文件(并仅在上一次读取过程中记住的位置后仅读取数据),然后将其分为代码中的行。

最新更新