读取文件,并监控新行

我正在寻找创建一个控制器应用程序,它将读取一个文件,并监视每一个新行,因为它每隔0.5秒被另一个进程写入。

如何在使用.NET 4.5的控制台应用程序中实现这一目标?

正如@Sudhakar所提到的,当您希望在文件偶尔更新时收到通知时,FileSystemWatcher非常有用,并且当您希望不断处理来自不断增长的文件(例如繁忙日志文件)的信息时,定期轮询非常有用。

我想补充一下关于效率的说明。 如果您关心处理大型文件(许多MB或GB)的效率和速度,那么您将需要在阅读和处理更新时跟踪文件中的位置。 例如:

// This does exactly what it looks like. long position = GetMyLastReadPosition(); using (var file = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { if (position == file.Length) return; logFile.Position = position; using (var reader = new StreamReader(file)) { string line; while ((line = reader.ReadLine()) != null) { // Do reading. } position = file.Position; // Store this somewhere too. } } 

这应该允许您避免重新处理已经处理的文件的任何部分。

听起来你想要一个适用于Windows的尾部版本。 有关讨论,请参阅“ 查找与unix tail命令等效的窗口 ”。

否则,使用FileShare.ReadWrite 打开文件而不阻止其他进程访问。 寻找到最后读取然后使用Thread.Sleep()或Task.Delay()在看到是否有任何更改之间等待半秒。

例如:

 public static void Follow(string path) { // Note the FileShare.ReadWrite, allowing others to modify the file using (FileStream fileStream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { fileStream.Seek(0, SeekOrigin.End); using (StreamReader streamReader = new StreamReader(fileStream)) { for (;;) { // Substitute a different timespan if required. Thread.Sleep(TimeSpan.FromSeconds(0.5)); // Write the output to the screen or do something different. // If you want newlines, search the return value of "ReadToEnd" // for Environment.NewLine. Console.Out.Write(streamReader.ReadToEnd()); } } } } 

解决方案1:您可以使用FileSystemWatcher

来自MSDN:

使用FileSystemWatcher监视指定目录中的更改。 您可以监视指定目录的文件和子目录中的更改。 您可以创建一个组件来监视本地计算机,网络驱动器或远程计算机上的文件。

解决方案2:您可以通过创建Timer并每5秒读取文件内容来使用Polling