2011-07-07 43 views
2

我一直在寻找创建应用程序的好主意的网页。服务或vb脚本,它们将不断监视文件的变化。但是,我希望它在没有更改时提醒我。我正在监视的文件是由非常重要的应用程序创建的日志。如果该文件停止增长,那意味着应用程序出现问题,并且它已停止写入日志文件。监视文件的更改

有没有人有任何想法?我已经在C#中使用FileSystemWatcher类了,但是我不知道是否有一种方法可以用来在文件没有改变时发出警报,因为所有事件都会看到更改。

谢谢。

回答

3

只需使用上的间隔该文件应在更新触发一个计时器。

检查文件大小(FileInfo.Length),如果是一样的计时器所触发的最后一次,它并没有增长。

+0

我喜欢定时器的想法。为了让它不断运行,我需要将它创建为服务? – Matt

+0

@Matt - Windows服务听起来非常适合这类任务。 – Oded

+0

感谢您的意见。我甚至没有想过使用计时器。 – Matt

1

可以使用FileSytemWatcher类:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

更新:嗯,它支付进行到底读的问题...你可以设置一个Timerref)为您想的不活动时间在FileSystemWatcher事件中被提醒并重置计时器。

+0

我已经用它,但它会监视没有变化? – Matt

+0

它在文件_changes_时触发,而不是在_doesn't_时触发。 – Oded

+2

@Variant:你看过这个问题吗? OP明确表示他们已经使用'FileSystemWatcher' – spender

2

在这种情况下,你不需要一个观察者,你可以使用一个计时器。每隔几分钟(或任何适合您的需求),检查文件大小。将最后一个尺寸存储在某处。下次您检查它时,将以前的值与当前值进行比较。如果它们相同,那么文件没有改变,您可以发出警报。

2

文件大部分时间没有变化。您需要定义一个时间段,超过该时间段,记录过程将被视为停止。启动一个计时器(当它完成时)将表示记录已停止。每次更改事件时,请重置计时器。

+0

该文件可以每隔几秒或几分钟更改一次。我正在考虑用10分钟作为我的时间表。 – Matt

0

我建议您结合您已获得的所有答案。

使用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... 
     } 
    } 
}