我正在开发一个Windows服务,它可以监视几个文件夹以进行更改,创建和删除。除了一个观察单个文件(具有配置设置的XML文件)进行微小更改的观察者之外,一切运行良好。
我尝试使用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>
答案 0 :(得分:11)
我认为问题是NotifyFilter
的价值。您实际上只是告诉FileSystemWatcher
查找文件名更改。要让它为文件修改引发Changed
事件,您还需要指定LastWrite
标记。
即。适当的代码行应更改为:
XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName |
IO.NotifyFilters.LastWrite;
有关详细信息,请参阅MSDN上的NotifyFilters
页面。
注意:正如Joshua Belden指出的那样,你根本不需要设置NotifyFilter
属性,因为MSDN表示:“默认是LastWrite,FileName的按位OR组合,和DirectoryName。“但是,我认为在这种情况下最好是明确的 - 然后它会明确显示FileSystemWatcher
是什么,而不是正在观看。
答案 1 :(得分:1)
您需要将.NotifyFilter
更改为类似LastWrite
的内容,以便接收我相信的更改。
MSDN链接here
答案 2 :(得分: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
将所有通知过滤器一起转储。