我一直在寻找创建应用程序的好主意的网页。服务或vb脚本,它们将不断监视文件的变化。但是,我希望它在没有更改时提醒我。我正在监视的文件是由非常重要的应用程序创建的日志。如果该文件停止增长,那意味着应用程序出现问题,并且它已停止写入日志文件。监视文件的更改
有没有人有任何想法?我已经在C#中使用FileSystemWatcher类了,但是我不知道是否有一种方法可以用来在文件没有改变时发出警报,因为所有事件都会看到更改。
谢谢。
我一直在寻找创建应用程序的好主意的网页。服务或vb脚本,它们将不断监视文件的变化。但是,我希望它在没有更改时提醒我。我正在监视的文件是由非常重要的应用程序创建的日志。如果该文件停止增长,那意味着应用程序出现问题,并且它已停止写入日志文件。监视文件的更改
有没有人有任何想法?我已经在C#中使用FileSystemWatcher类了,但是我不知道是否有一种方法可以用来在文件没有改变时发出警报,因为所有事件都会看到更改。
谢谢。
只需使用上的间隔该文件应在更新触发一个计时器。
检查文件大小(FileInfo.Length
),如果是一样的计时器所触发的最后一次,它并没有增长。
可以使用FileSytemWatcher
类:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx
更新:嗯,它支付进行到底读的问题...你可以设置一个Timer
(ref)为您想的不活动时间在FileSystemWatcher
事件中被提醒并重置计时器。
在这种情况下,你不需要一个观察者,你可以使用一个计时器。每隔几分钟(或任何适合您的需求),检查文件大小。将最后一个尺寸存储在某处。下次您检查它时,将以前的值与当前值进行比较。如果它们相同,那么文件没有改变,您可以发出警报。
文件大部分时间没有变化。您需要定义一个时间段,超过该时间段,记录过程将被视为停止。启动一个计时器(当它完成时)将表示记录已停止。每次更改事件时,请重置计时器。
该文件可以每隔几秒或几分钟更改一次。我正在考虑用10分钟作为我的时间表。 – Matt
我建议您结合您已获得的所有答案。
使用FileSytemWatcher类来监视更改并使用计时器等待一段时间自上次更改以来。
最简单的解决方案将看起来像ManualResetEvent和DateTime变量(不要忘记内存障碍)和后台线程。
那么,你就会有一个是这样的:
DateTime _lastChangeTime;
ManualResetEvent _exitEvent; // set this event to exit thread.
private void Watcher_Change(...)
{
_lastChangeTime = DateTime.UtcNow;
Thread.MemoryBarrier();
}
private void ThreadProc()
{
while (_exitEvent.Wait(1000)) // every second
{
Thread.MemoryBarrier();
if (DateTime.UtcNow.Subtract(lastChangeTime) > [some reasonable time])
{
// shit happens...
}
}
}
我喜欢定时器的想法。为了让它不断运行,我需要将它创建为服务? – Matt
@Matt - Windows服务听起来非常适合这类任务。 – Oded
感谢您的意见。我甚至没有想过使用计时器。 – Matt