FileSystemWatcher更改了未引发的事件

时间:2009-04-29 15:25:08

标签: .net vb.net filesystemwatcher

我正在开发一个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>

3 个答案:

答案 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

将所有通知过滤器一起转储。