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:
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 318498
Url: https://administrator.de/forum/verzeichnisueberwachung-in-vb-funktioniert-code-evtl-anpassbar-oder-unsauber-318498.html
Ausgedruckt am: 12.05.2025 um 20:05 Uhr
4 Kommentare
Neuester Kommentar

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.

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!
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!