VB.et FileSystemWatcher 事件处理程序 - 处理程序重复调用(不需要)

VB.et FileSystemWatcher Event Handler - Calls of Handler Repeats (Unwanted)

提问人:hackedsolutions 提问时间:8/28/2022 更新时间:8/28/2022 访问量:35

问:

我正在尝试通过将文件添加到列表中的自定义类来使用 FileSystemWatch 类记录目录中的文件活动,不幸的是,似乎在复制文件或将新文件添加到目标目录时,它运行了 4 次而不是一次。

将文件添加到目录时,AddressOf Sub 将写入 3 到 4 次,而不是只写入一次。我不知道为什么。

下面是代码片段。

Public fileTypefilter As String = "*.xlsx"
Public DesDir As String = "C:\"
Public EventLog As List(Of FileEvent)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim watchDir As String = DesDir
    Dim watch As New FileSystemWatcher(watchDir)
    Me.Text = "Monitoring " & watch.Path

    watch.IncludeSubdirectories = false
    watch.Filter = "*.xlsx"

    AddHandler watch.Changed, AddressOf watch_Changed

    watch.EnableRaisingEvents = True
End Sub

Private Sub watch_Changed(ByVal sender As Object, ByVal e As FileSystemEventArgs)

    Try
        EventLog.Add(New FileEvent(e.FullPath))
        Exit Sub
    Catch ex As NullReferenceException
        EventLog = New List(Of FileEvent)({New FileEvent(e.FullPath)})
        Exit Sub
    End Try


End Sub
vb.net 事件 filesystemwatcher

评论

0赞 John 8/28/2022
这些台词的意义何在?在它们中的任何一个之后都没有更多的代码要执行,那么它们为什么会在那里呢?Exit Sub
0赞 John 8/28/2022
我强烈建议在事件处理程序中删除该代码,并在设计器中添加该代码。然后,可以在“属性”窗口中对其进行配置。请注意,如果这样做,则默认情况下,该属性将设置为窗体。如果您不知道这有什么意义,您应该阅读相关文档。LoadFileSystemWatcherSynchronizingObject
0赞 John 8/28/2022
当您可以在其中声明字段时创建列表对象时,为什么会有该异常处理程序?
0赞 hackedsolutions 9/1/2022
感谢您的反馈,先生/小伙子。我会仔细查看,额外的随机“Exit Sub”语句是为了进行故障排除。至于异常处理程序,这是我确保对象/列表的故障安全初始化的方法,它绝不是完美的,但它可以工作(直到它中断)。我将更深入地查看 FileSystemWatcher 文档,看看我是否遗漏了任何内容。

答:

2赞 John 8/28/2022 #1

由于发生了多次更改,因此会多次执行事件处理程序。与往常一样,您应该先自己阅读相关文档,其中写道:Changed

文件或文件夹的更改。更改类型包括:对大小、属性、安全设置、上次写入和上次访问时间的更改。

如果您不想记录每个单独的更改,则需要以某种方式过滤它们。例如,您可能希望记录特定路径发生更改的时间,如果自同一路径的上次更改以来未经过某个最短时间,则不记录更改。

还可以选择使用 a 而不是 .可以将其配置为使用适当的相等比较器,然后您可以根据需要为同一路径调用任意次数,并且只会添加一次。这意味着,如果稍后对同一路径发生一组更改,则不会记录这些更改。我不确定这对你来说是否是一个问题。HashSetListAdd