我试图在FileSystemWatcher
更改时将事件数量减少到一个(或者至少在事件被提升时在文本框中显示文本,删除重复的文本或其他一些方法)。
Visual Basic 中是否有任何解决方法,或者至少要删除我已附加到状态日志文本框的重复文本(当OnChange
sub为时叫)?
我对此做了大量研究,看起来没有“简单”修复。
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx(Microsfot文档,其中包含FileSystemWatcher可能引发多个事件的通知。)
http://weblogs.asp.net/ashben/archive/2003/10/14/31773.aspx(一篇文章指出,“为了解决这个问题[引发了两个事件],只需删除显式事件处理程序(AddHandler ...)。”没有进一步解释什么“...删除显式事件处理程序(AddHandler ...)。”表示。)
Why does FileSystemWatcher fire twice(这个问题被问到“什么”删除显式事件处理程序“是什么意思?”没有人回答这个问题。另外,给出的答案有这部分代码:
Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, _
ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed
当我尝试这个时,我在FileSystemWatcher1下得到蓝线:
Handles子句需要在中定义一个WithEvents变量 包含类型或其基本类型之一。
我也尝试了类似的解决方法,在EnableRaisingEvents = False
中设置OnChanged sub
,然后让程序执行我需要的操作,然后设置EnableRaisingEvents = True
。它似乎有效,但有时只是。我相信这里有一些竞争条件。 EnableRaisingEvents
不会足够快地设置为false,然后会调用多个OnChanges
导致重复的结果。
http://spin.atomicobject.com/2010/07/08/consolidate-multiple-filesystemwatcher-events(一个相当复杂的修复,它在C#中,我可以理解其中一些,但我需要在Visual Basic中看到它。)
http://www.codeproject.com/Articles/58740/FileSystemWatcher-Pure-Chaos-Part-1-of-2(这篇文章的两篇文章是在C#中,但似乎是最可靠的修复。虽然这篇文章篇幅很长,但我并不了解所有内容,因为它不在Visual Basic中。 )
Private Sub FormBackUpFile_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Dim varFileSystemWatcher As New FileSystemWatcher()
Dim directoryPath As String = Path.GetDirectoryName(TextBoxFileLocation.Text)
varFileSystemWatcher.SynchronizingObject = Me
varFileSystemWatcher.Path = directoryPath
varFileSystemWatcher.NotifyFilter = (NotifyFilters.LastWrite)
' THIS IS THE EVENT THAT IS RAISED TWICE OR MORE
AddHandler varFileSystemWatcher.Changed, AddressOf OnChanged
varFileSystemWatcher.EnableRaisingEvents = True
End Sub
Private Sub OnChanged(source As Object, e As FileSystemEventArgs)
' Stops FileSystemWatcher from firing twice or more but,
' ONLY WORKS AT RANDOM.
varFileSystemWatcher.EnableRaisingEvents = False
' Copies the specified file to the specified location
My.Computer.FileSystem.CopyFile(e.FullPath, TextBoxCopyTo.Text & "\" _
& e.Name, True)
' THIS IS WHERE THE TEXT WILL BE ADDED TO THE TEXTBOX TWICE OR MORE.
TextBoxStatusLog.AppendText(Environment.NewLine & Environment.NewLine & _
statusUpdate)
' Starts the FileSystemWatcher again
varFileSystemWatcher.EnableRaisingEvents = True
End Sub