作为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
结束班
答案 0 :(得分:0)
这里要考虑的第一件事是观察者是run方法中的局部变量。这意味着在退出run方法后,您的观察者将立即被垃圾收集。您需要在globlal类级别声明它并保持该类的实例,直到您完成使用监视代码。
Public Class FileWatcher
Dim watcher As New FileSystemWatcher()
Public Sub run(path As String)
....
接下来请记住,OnChanged和OnRenamed是事件处理程序,因此它们应该声明为Sub而不是Function。当然,他们不会返回任何东西
如果您需要这些处理程序的值,您需要实现某种全局变量,以保持数据的进一步处理。一个示例可以是一个列表(应扩展字符串列表以区分添加和删除的文件,或者更好地使用您自己的类和此类实例的列表)
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