2011-07-07 233 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... 
     } 
    } 
}