matzetto
Goto Top

Verzeichnisüberwachung in VB funktioniert, Code evtl. anpassbar oder unsauber?

Hallo Experten,

Ich arbeite für meine Firma an einem recht simplen Programm (Visual Basic, Umgebung: Visual Studio 2015, als VB Windows Form), dass einfach nur ein bestimmtes Verzeichnis auf Dateien mit bestimmten Zeichenkombinationen im Namen überprüfen soll. Das Programm ist auch soweit fertig gestellt und funktioniert. Jedoch finde ich das an einigen Stellen die Lösung sehr unelegant und unsauber wirkt. Hier dazu einmal der Code:

Imports Scripting
Imports System.Text.RegularExpressions

Public Class Form1
    Dim fso
    Dim rgx2 As New Regex(".*?(TOK).*\.\d{3}$")  
    Dim rgx As New Regex(".*?(VOK).*\.\d{3}$")  
    Dim text1 As String
    Dim text2 As String
    Dim text3 As String
    Dim text4 As String
    Dim text5 As String

    Private Declare Function FlashWindowEx Lib "user32.dll" (ByRef pfwi As FLASHWINFO) As Int32  
    Public Const FLASHW_STOP = 0
    Public Const FLASHW_CAPTION = &H1
    Public Const FLASHW_TRAY = &H2
    Public Const FLASHW_ALL = &H3
    Public Const FLASHW_TIMER = &H4
    Public Const FLASHW_TIMERNOFG = &HC

    Const SEARCHFOLDER = "C:\Documents"  

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        text5 = "Überwachtes Verzeichnis: ExpImp:"  
        Label1.Text = text5
        text1 = "Vollabgleiche (VOK):"  
        Label3.Text = text1
        text3 = "Teilabgleiche (TOK):"  
        Label7.Text = text3
        fso = CreateObject("Scripting.FileSystemObject")  
        InitializeTimer()
        InitializeTimer1()
        InitializeTimer2()
    End Sub

    Public Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        InitializeTimer()
    End Sub

    Public Sub InitializeTimer()
        Timer1.Enabled = True
        Timer1.Interval = 400
        DoSearch()
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        InitializeTimer1()
    End Sub

    Public Sub InitializeTimer1()
        Timer2.Enabled = True
        Timer2.Interval = 10
        Warning()
    End Sub

    Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
        InitializeTimer2()
    End Sub

    Public Sub InitializeTimer2()
        Timer3.Enabled = True
        Timer3.Interval = 60000
        Timer2.Enabled = True
    End Sub

    Public Sub DoSearch()
        Dim searchstring As Object
        Dim COMNothing As Object
        COMNothing = New Runtime.InteropServices.UnknownWrapper(Nothing)
        searchstring = COMNothing
        If CheckFiles1(SEARCHFOLDER, searchstring) Then
            text2 = "Es sind neue Vollabgleiche vorhanden! (Kann etwas länger dauern!)"  
            Label5.Text = text2
            Label5.ForeColor = Color.Red
        Else
            text2 = "Keine neuen Vollabgleiche vorhanden!"  
            Label5.Text = text2
            Label5.ForeColor = Color.Green
        End If
        If CheckFiles2(SEARCHFOLDER, searchstring) Then
            text4 = "Es sind neue Teilabgleiche vorhanden!"  
            Label9.Text = text4
            Label9.ForeColor = Color.Red
        Else
            text4 = "Keine neuen Teilabgleiche vorhanden!"  
            Label9.Text = text4
            Label9.ForeColor = Color.Green
        End If
    End Sub

    Function CheckFiles1(folder, searchstring) As Boolean
        For Each file In fso.GetFolder(folder).Files
            If rgx.IsMatch(file.Name) Then
                CheckFiles1 = True

                Exit Function
            End If
        Next
        CheckFiles1 = False
    End Function

    Function CheckFiles2(folder, searchstring) As Boolean
        For Each file In fso.GetFolder(folder).Files
            If rgx2.IsMatch(file.Name) Then
                CheckFiles2 = True

                Exit Function
            End If
        Next
        CheckFiles2 = False
    End Function

    Function funk1() As Boolean
        If text2 <> "Keine neuen Vollabgleiche vorhanden!" Then  
            text2 = Nothing
            funk1 = True
            Timer2.Enabled = False
            Exit Function
        End If
        funk1 = False
    End Function

    Function funk2() As Boolean
        If text4 <> "Keine neuen Teilabgleiche vorhanden!" Then  
            text4 = Nothing
            funk2 = True
            Timer2.Enabled = False
            Exit Function
        End If
        funk2 = False
    End Function

    Private Sub Warning()
        If funk1() = True Then
            FlashIcon(Handle, FLASHW_TRAY + FLASHW_TIMERNOFG)
            SetBalloonTip1()
        ElseIf funk1() = False Then
            NotifyIcon1.Text = "Vollabgleicheüberwachung aktiv!"  
        End If
        If funk2() = True Then
            FlashIcon(Handle, FLASHW_TRAY + FLASHW_TIMERNOFG)
            SetBalloonTip2()
        ElseIf funk2() = False Then
            NotifyIcon2.Text = "Teilabgleicheüberwachung aktiv!"  
        End If
    End Sub

    Public Structure FLASHWINFO
        Public cbSize As Int32
        Public hwnd As IntPtr
        Public dwFlags As Int32
        Public uCount As Int32
        Public dwTimeout As Int32
    End Structure

    Public Sub FlashIcon(ByVal Handle%, ByVal Flags%)
        Dim flash As New FLASHWINFO
        flash.cbSize = Runtime.InteropServices.Marshal.SizeOf(flash)
        flash.hwnd = Handle
        flash.dwFlags = Flags
        flash.dwTimeout = 500
        FlashWindowEx(flash)
    End Sub

    Public Sub SetBalloonTip1()
        NotifyIcon1.BalloonTipTitle = "Neue Vollabgleiche!"  
        NotifyIcon1.BalloonTipText = "Es sind neue Vollabgleiche vorhanden! Bitte importieren Sie diese!"  
        NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info
        NotifyIcon1.ShowBalloonTip(5000)
        NotifyIcon1.Text = "Neue Vollabgleiche!"  
    End Sub

    Public Sub SetBalloonTip2()
        NotifyIcon2.BalloonTipTitle = "Neue Teilabgleiche!"  
        NotifyIcon2.BalloonTipText = "Es sind neue Teilabgleiche vorhanden! Bitte importieren Sie diese!"  
        NotifyIcon2.BalloonTipIcon = ToolTipIcon.Info
        NotifyIcon2.ShowBalloonTip(5000)
        NotifyIcon2.Text = "Neue Teilabgleiche!"  
    End Sub

End Class

Ich persönlich finde die Lösung mit den Timern sehr unsauber da ich im Prinzip einen Timer abschalte mit einem Anderen damit der BalloonTip nicht alle 400 Millisekunden aufbloppt sondern nur einmal alle 60 Sekunden, das wiederum passt mir ganz gut denn das worauf die Anzeige hinweist sollte möglichst schnell bearbeitet werden, 60 Sekunden sind dann ok. Allerdings brauche ich auch die 400 Millisekunden damit möglichst in Echtzeit das Verzeichnis überwacht wird. Der zweite Timer ist dann tatsächlich nur dafür da damit auch direkt nach Programmstart eine Warnung kommt wenn neue Dateien vorhanden sind. Ich selbst habe nicht viel Ahnung von VB und habe den Kern des Programms manuell aus einer VBS/hta konvertiert, die ich vorher gebastelt hatte jedoch ist es in Script Sprachen nicht möglich das Icon in der Taskbar zu flashen, und entsprechend angepasst. Vielleicht hat ja einer hier im Forum eine Idee wie man das besser lösen kann. Ich würde mich über Anregungen sehr freuen.

Content-Key: 318498

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

Printed on: April 24, 2024 at 01:04 o'clock

Mitglied: 131223
131223 Oct 20, 2016 updated at 07:04:47 (UTC)
Goto Top
Ich persönlich finde die Lösung mit den Timern sehr unsauber
Oh ja.

Sowas macht man heute eventdriven mit einem FilesystemWatcher oder per WMI Eventsubscription (InstanceCreationEvent).
Dann generiert das OS bei jeder neu erstellten Datei ein Event mit Übergabe des Dateinamens womit du dann entsprechend reagierst.

Script, dass konstant läuft einen Ordner scannt und Dateien automatisch verschiebt

p.s. Was soll das in der Kategorie VBA? VB.net ist "kein" VBA.
Member: emeriks
emeriks Oct 20, 2016 at 07:03:27 (UTC)
Goto Top
Hi,
richtig. Nimm den FileSystemWatcher.

E.
Member: matzetto
matzetto Oct 20, 2016 at 07:57:50 (UTC)
Goto Top
Hi, erst mal danke für die Antwort. Wegen FilesystemWatcher werde ich mich belesen, danke für den Hinweis.
Was den Link betrifft so hilft der mir nicht weiter. Möchte keine Dateien verschieben oder umbenennen oder sonst etwas. Regular Expression passt da für meine Zwecke ganz gut. Wegen der Kategorie hast du Recht, hatte nur VB gesehen und nicht weiter geguckt. Ist angepasst.

MfG
Mitglied: 131223
131223 Oct 20, 2016 updated at 08:04:02 (UTC)
Goto Top
Zitat von @matzetto:
Was den Link betrifft so hilft der mir nicht weiter.
Dann hast du dir nicht alle Links dort im Link angesehen!

Z.B. Per WMI
Automatismus für PDF (Umbenennung mit Datum und Uhrzeit danach in Ordner verschieben) mit einem VBS

Das sollte nur das Prinzip verdeutlichen wie diese eventgesteuerten Funktionen funktionieren.

Die Anpassung ist ja dann ein Klacks, bei jedem Event zusätzlich noch den Regex über den Namen schicken, und bei Erfolg weitermachen!