2009-04-29 34 views
1

我工作的一個Windows服務,手錶的幾個文件夾的變化,有所創造,有所缺失。除了一個監視單個文件(帶有配置設置的XML文件)的細微變化的監視器之外,它一切正常。FileSystemWatcher的更改事件沒有被提出

我試着服用Windows服務代碼,並把它變成一個簡單的Windows應用程序與啓動/停止文件系統觀察家按鈕,並通過它加強。它從不檢測XML配置文件的文件更改。這些更改確實發生,文件的「修改日期」正在更新。

XmlEventReferences = New System.IO.FileSystemWatcher() 
XmlEventReferences.Path = "C:\XmlReferences\" 
XmlEventReferences.Filter = "*.xml" 
XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName 
AddHandler XmlEventReferences.Changed, AddressOf ReloadEventReferences 
AddHandler XmlEventReferences.Created, AddressOf ReloadEventReferences 
AddHandler XmlEventReferences., AddressOf ReloadEventReferences 
XmlEventReferences.EnableRaisingEvents = True 

這是一些代碼,這是XML文件的樣本:

<EventReference> 
    <ER_EL_NUMBER>1</ER_EL_NUMBER> 
    <ER_SEND_TO_DATABASE>true</ER_SEND_TO_DATABASE> 
    <ER_ACTIVATE_ALARM>true</ER_ACTIVATE_ALARM> 
    <ER_DESCRIPTION /> 
</EventReference> 

回答

11

我相信問題是NotifyFilter值。您實際上只告訴FileSystemWatcher查找文件名稱更改。爲了讓它也提高Changed事件以進行文件修改,您還需要指定LastWrite標誌。

即代碼此時,相應的行應改爲:

XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName | 
    IO.NotifyFilters.LastWrite; 

更多信息,請參閱MSDN上的NotifyFilters頁面。

注意:正如Joshua Belden指出的那樣,甚至根本不需要設置NotifyFilter屬性,因爲MSDN指出:「默認值是LastWrite,FileName和DirectoryName的按位或組合。但是,我認爲這是最好要明確在這種情況下 - 它,然後使它十分明顯,以什麼FileSystemWatcher是,是不是

+0

謝謝!我欣賞的幫助 – Paxenos 2009-04-29 15:43:04

1

您需要將您的.NotifyFilter更改爲類似LastWrite拿起變化,我相信。

MSDN鏈接here

0

此代碼似乎對我的工作,拿起編輯到的test.xml文件。是

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim XmlEventReferences = New System.IO.FileSystemWatcher() 
    XmlEventReferences.Path = "C:\" 
    XmlEventReferences.Filter = "*.xml" 
    XmlEventReferences.EnableRaisingEvents = True 
    AddHandler XmlEventReferences.Changed, AddressOf Watch 
End Sub 

Private Sub Watch(ByVal sender As Object, ByVal e As FileSystemEventArgs) 
    Dim s As String = e.FullPath 
End Sub 

轉儲通知過濾器一起。

+0

從MSDN(http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.notifyfilter.aspx):「默認爲LastWrite,文件名,目錄名和的按位或組合「。所以是的,你不需要指定NotifyFilter的那一行,但是明確你所關注的內容並不會傷害你。 (無論如何,我會把它包括在內)。) – Noldorin 2009-04-29 15:39:14