duschgas
Goto Top

VB.NET KOmmando wird mehrfach ausgeführt (FileSystemWatcher)

Hallo,

ich stehe vor einem Problem.

Ich habe einen FileSystemWatcher.
  Dim PFAD As String = TextBox5.Text

                ' --- Instanziierung  
                Dim watcher As New FileSystemWatcher()
                watcher.Path = PFAD
                watcher.Filter = "*.ini"  
                watcher.IncludeSubdirectories = True

                watcher.NotifyFilter =
                 NotifyFilters.Attributes Or
                 NotifyFilters.LastAccess Or
                 NotifyFilters.LastWrite Or
                 NotifyFilters.Security Or
                 NotifyFilters.Size Or
                 NotifyFilters.FileName Or
                 NotifyFilters.DirectoryName

                AddHandler watcher.Changed,
                 AddressOf DS_aenderung
                AddHandler watcher.Created, AddressOf DS_neu
                AddHandler watcher.Deleted,
                 AddressOf DS_loeschen
                AddHandler watcher.Renamed, AddressOf DS_name

        watcher.EnableRaisingEvents = True

Wenn er eine neue Datei (*.ini) erkennt, dann soll eine im Hintergrund laufende Form geöffnet werden, was auch super funktioniert.
Die Form die sich öffnet, hat auch einen Button der das ganze wieder minimieren soll -> Me.Hide() & Me.ShowinTaskbar = False.

Leider öffnet sich die Form immer wieder selbständig, da ich vermute, das das irgendetwas mit dem Ablauf zu tun hat.
Besteht die Möglichkeit, ein Kommando in dem Fall "Me.Show" nur einmal auszuführen.

Bzw. das die Sub DS_neu allgemein nur einmal durchläuft?

   Public Sub DS_neu(ByVal source As Object,
    ByVal e As FileSystemEventArgs)

                Dim sb As StringBuilder = New StringBuilder(1024)

        INI.Lesen("Settings", "ShowMSG", "", sb, sb.Capacity, e.FullPath)  
        If sb.ToString = "True" Then  

            Try
                INI.Lesen("Notification", "Subject", "", sb, sb.Capacity, e.FullPath.Replace(".txt", ".ini"))  
                Me.Invoke(Sub() TextBox3.Text = sb.ToString)
                INI.Lesen("Picture", "NotPic", "", sb, sb.Capacity, e.FullPath.Replace(".txt", ".ini"))  
                If sb.ToString = "Notification" Then  
                    Me.Invoke(Sub() PictureBox1.Enabled = True)
                    Me.Invoke(Sub() PictureBox1.Image = My.Resources.blue_ico)
                ElseIf sb.ToString = "Error" Then  
                    Me.Invoke(Sub() PictureBox1.Enabled = True)
                    Me.Invoke(Sub() PictureBox1.Image = My.Resources.red_ico)
                ElseIf sb.ToString = "Warning" Then  
                    Me.Invoke(Sub() PictureBox1.Enabled = True)
                    Me.Invoke(Sub() PictureBox1.Image = My.Resources.yellow_ico)
                End If
                Threading.Thread.Sleep(25)
                Me.Invoke(Sub() TextBox2.Text = System.IO.File.ReadAllText(e.FullPath.Replace(".ini", ".txt")))  

'Hier öffnet die versteckte Form  
  Me.Invoke(Sub() Me.Show())

            Catch
            End Try
        End If


    End Sub

Vielen Dank
duschgas

Content-ID: 298769

Url: https://administrator.de/contentid/298769

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

duschgas
duschgas 10.03.2016 um 17:00:17 Uhr
Goto Top
Ich habe es doch gelöst bekommen und am Anfang mit

Me.Invoke(Sub() watcher.EnableRaisingEvents = False)

Die Events deaktiviert und am Ende wieder aktiviert.

Entschuldigt die Störung face-smile
emeriks
emeriks 10.03.2016 um 19:47:04 Uhr
Goto Top
Hi,
na ob das dann aber so elegant ist, wird sich zeigen. Was ist, wenn man in einem Zug mehrere INI-Dateien in den Pfad rein kopiert. Bekommt er dann alle Dateien gemeldet?

Schau mal hier: http://www.codeproject.com/Articles/58740/FileSystemWatcher-Pure-Chaos- ...
Darauf bin ich vor einiger Zeit gestoßen. Da hat sich schon mal jemand mit der Problematik beschäftigt, dass der FileSystemWatcher nur sehr schwammig meldet.

E.
duschgas
duschgas 10.03.2016 um 21:08:31 Uhr
Goto Top
Hallo emeriks,

vielen Dank für den Tipp.
Es kommt wirklich nur mal sporadisch eine *.ini Datei an. Vielleicht 1x im Monat. Dafür denke ich sollte die Lösung ausreichend sein.

Grüße
duschgas