1

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

3 回答 3

11

我认为问题在于NotifyFilter. 您实际上只告诉了FileSystemWatcher查找文件名更改。要让它也引发Changed文件修改事件,您还需要指定LastWrite标志。

即适当的代码行应更改为:

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

有关详细信息,请参阅NotifyFiltersMSDN 上的页面。

注意:正如 Joshua Belden 所指出的,您甚至根本不需要设置该NotifyFilter属性,因为正如MSDN所述:“默认值是 LastWrite、FileName 和 DirectoryName 的按位或组合。” 但是,我会争辩说,在这种情况下,最好是明确的——这样就可以非常清楚地了解FileSystemWatcher正在观看和观看的内容。

于 2009-04-29T15:30:13.047 回答
1

我相信你需要改变你.NotifyFilter的东西LastWrite来接受改变。

MSDN链接在这里

于 2009-04-29T15:29:32.673 回答
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

将通知过滤器一起转储。

于 2009-04-29T15:35:42.690 回答