FileSystemWatcher 没有触发事件

FileSystemWatcher is not firing events

作为 vb 的新手,我的 FileSystemWatcher 遇到了一些麻烦。由于某些不祥的原因,它不会触发任何事件。我想检查目录中是否有被复制、删除或编辑的文件。

感谢任何帮助!!

这是我的代码:

Public Class FileWatcher

Public Sub run(path As String)
    Dim watcher As New FileSystemWatcher()

    watcher.Path = path
    watcher.Filter = "*.xml"
    watcher.NotifyFilter = NotifyFilters.FileName Or NotifyFilters.LastWrite Or NotifyFilters.CreationTime

    AddHandler watcher.Changed, AddressOf OnChanged
    AddHandler watcher.Created, AddressOf OnChanged
    AddHandler watcher.Deleted, AddressOf OnChanged
    AddHandler watcher.Renamed, AddressOf OnRenamed

    watcher.EnableRaisingEvents = True

End Sub


Public Function OnChanged(source As Object, e As FileSystemEventArgs) As String
    ' Returns file name for later use
    Console.WriteLine("Monitoring: " + e.FullPath)
    Return e.FullPath
End Function

Public Function OnRenamed(source As Object, e As RenamedEventArgs) As String
    Console.WriteLine("Monitoring: " + e.FullPath)
    Return e.FullPath
End Function

结束Class

这里首先要考虑的是 watcher 是 运行 方法内部的一个局部变量。这意味着您的观察者将在退出 运行 方法后立即被垃圾回收。您需要在全局 class 级别声明它并保持该 class 的一个实例,直到您完成使用监控代码。

Public Class FileWatcher
     Dim watcher As New FileSystemWatcher()

     Public Sub run(path As String)

        ....

接下来请记住 OnChanged 和 OnRenamed 是事件处理程序,因此应将它们声明为 Sub 而不是 Function。当然,他们什么都不 return

如果您需要这些处理程序的值,您需要实施某种全局变量来保存您的数据以供进一步处理。一个例子可以是一个列表(应该扩展字符串列表以区分添加和删除的文件,或者更好地使用你自己的 class 和这个 classes 实例的列表)

Dim changedFiles = new List(Of String)()
Dim renamedFiles = new List(Of String)()
Public Sub OnChanged(source As Object, e As FileSystemEventArgs) 
    Console.WriteLine("Monitoring: " + e.FullPath)
    changedFiles.Add(e.FullPath)
End Sub

Public Sub OnRenamed(source As Object, e As RenamedEventArgs)
    Console.WriteLine("Monitoring: " + e.FullPath)
    renamedFiles.Add(e.FullPath)
End Sub