【发布时间】:2018-02-23 08:46:31
【问题描述】:
我正在尝试创建一个简单的文件监视器,它定期检查日志文件中的更新并处理更新。我尝试使用 FileSystemWatcher,但这需要我的应用程序永远运行。我更多地考虑阅读更改,退出,等待计时器,再次阅读更改。
我创建了一个定期运行的服务来读取文件并获取全部数据。下面是简单的代码。
private void SchedularCallback(object e)
{
string logFile = ReadFromFile("C:\\test.log");
this.WriteToFile(logFile);
this.ScheduleService();
}
WriteToFile 函数将数据写入单独的文件(处理数据,实际处理可能涉及其他任务,如调用 WCF 服务、检查互联网访问等)。每次回调发生时,ReadFromFile 都会读取日志文件。下面是读取文件的代码。
private string ReadFromFile(string path)
{
try
{
string logs = "";
using (StreamReader reader = new StreamReader(path, true))
{
logs = reader.ReadToEnd();
reader.Close();
}
return logs;
}
catch (Exception ex)
{
WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);
//Stop the Windows Service.
using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SimpleService"))
{
serviceController.Stop();
}
return "";
}
}
如您所见,每次回调发生时,此代码都会读取整个文件。由于日志文件最终可能非常大,因此不可能每次都读取和处理整个文件。为了改善这一点,我想到了使用 FileSystemWatcher,但这将使我的服务永远运行并且只是一个真正的性能消耗。相反,如果我可以只读取文件中的更改,它会更快。
我也想过存储流写入器的最后一个偏移量,但这只有在附加数据时才有效。如果有人删除整个日志或更改一两行,最后一个偏移量将不起作用。
在这种情况下,最好的方法是什么。日志文件显然不会不断变化,所以我不需要让我的服务保持运行。我不确定二进制流然后与最后一个二进制流进行比较是否是一个好主意。任何关于可能方法的建议都值得赞赏。基本上就像 git 所做的那样来识别自上次提交以来的更改,这就是我正在寻找的。p>
谢谢。
【问题讨论】:
标签: c# file-handling