【问题标题】:FileSystemWatcher Changed Event not being raisedFileSystemWatcher Changed 事件未引发
【发布时间】:2009-04-29 15:25:08
【问题描述】:

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

【问题讨论】:

    标签: .net vb.net filesystemwatcher


    【解决方案1】:

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

    即相应的代码行应改为:

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

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

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

    【讨论】:

      【解决方案2】:

      您需要将您的 .NotifyFilter 更改为 LastWrite 之类的东西,我相信您才能接受更改。

      MSDN 链接here

      【讨论】:

        【解决方案3】:

        这段代码似乎对我有用,对 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
        

        将通知过滤器全部转储。

        【讨论】:

        • 来自 MSDN (msdn.microsoft.com/en-us/library/…):“默认值为 LastWrite、FileName 和 DirectoryName 的按位或组合。”所以,是的,您不需要指定 NotifyFilter 的行,但明确说明您正在观看的内容并没有什么坏处。 (出于这个原因,我无论如何都会包括它。)
        猜你喜欢
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多