Why does FileSystemWatcher fire twice

前端 未结 3 800
温柔的废话
温柔的废话 2021-01-12 06:00

why does the FileSystemWatcher fire twice? Is there an easy way to fix it? Surely if I update or edit the text file it should only fire once?

this link here http:/

3条回答
  •  庸人自扰
    2021-01-12 06:30

    Today i crashed in FileSystemWatcher and found this site. Suggested Thread.Sleep cannot completely eliminate problem. Tested with fast counter-integer. And is blocking UI. Most problematic is startup, it sliped trough at 5s. Then i set FileSystemWatcher1.EnableRaisingEvents = False immediately in TimerWatcherChanged.Tick and never enabled again... But surprisingly counter still catch up-to 4 events! I would like to share my solution, non-blocking, with adjustable Timer. Feedback is welcome.

    Imports System.IO
    
    Imports System.Diagnostics
    
    Public Class Form1
      Dim fileName As String
      Dim Fsw_counter As Integer
      WithEvents TimerWatcherChanged As New Windows.Forms.Timer
      WithEvents TimerTest As New Windows.Forms.Timer
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TimerWatcherChanged.Interval = 100
        TimerTest.Interval = 100 : TimerTest.Start()
        TextBox1.Text = "C:\Downloads\New Text Document.txt"
        TextBox1.SelectionStart = TextBox1.Text.Length
        WatcherSetup()
      End Sub
    
      Sub WatcherSetup()
        fileName = TextBox1.Text
        FileSystemWatcher1.IncludeSubdirectories = False
        FileSystemWatcher1.Path = Path.GetDirectoryName(fileName)
        FileSystemWatcher1.Filter = Path.GetFileName(fileName)
        FileSystemWatcher1.NotifyFilter = NotifyFilters.LastWrite
        FileSystemWatcher1.EnableRaisingEvents = True
      End Sub
    
      Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        WatcherSetup()
      End Sub
    
      Private Sub FileSystemWatcher1_Changed(sender As Object, e As FileSystemEventArgs) Handles FileSystemWatcher1.Changed
        If TimerWatcherChanged.Enabled = False Then
          TimerWatcherChanged.Enabled = True
          Fsw_counter += 1
          ' ***** Your WATCH Code put here... *****
        End If
      End Sub
    
      Private Sub TimerWatcherChanged_Tick(sender As Object, e As EventArgs) Handles TimerWatcherChanged.Tick
        TimerWatcherChanged.Enabled = False
      End Sub
    
      Private Sub TimerTest_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TimerTest.Tick
        TextBox2.Text = "Changed: " & Fsw_counter
        If TimerWatcherChanged.Enabled = True Then
          TextBox2.BackColor = Color.Red
        Else
          TextBox2.BackColor = Color.LawnGreen
        End If
      End Sub
    End Class
    

提交回复
热议问题