3 Stimmen

Wie erkenne ich, wenn eine Datei in einem VBA-Makro geändert wurde?

Gibt es eine Möglichkeit, eine Datei in VBA (das im Wesentlichen VB6 ist) zu überwachen, so dass ich weiß, wann die Datei geändert wurde? -- ähnlich wie bei este nur möchte ich nicht wissen, wann eine Datei unbenutzt gerade dann, wenn seine geändert .

Die Antworten, die ich gefunden habe, empfehlen die Verwendung von "FileSystemWatcher" und der Win32-API "FindFirstChangeNotification". Ich kann aber nicht herausfinden, wie ich diese verwenden kann, hat jemand eine Idee?

3voto

Robin Rodricks Punkte 104651

Okay, ich habe eine Lösung zusammengestellt, die in der Lage ist, Änderungen im Dateisystem zu erkennen, und zwar in VBA (VB6).

Public objWMIService, colMonitoredEvents, objEventObject

'call this every 1 second to check for changes'
Sub WatchCheck()
On Error GoTo timeout
    If objWMIService Is Nothing Then InitWatch 'one time init'
    Do While True
        Set objEventObject = colMonitoredEvents.NextEvent(1) 
         '1 msec timeout if no events'
        MsgBox "got event"

        Select Case objEventObject.Path_.Class
            Case "__InstanceCreationEvent"
                MsgBox "A new file was just created: " & _
                    objEventObject.TargetInstance.PartComponent
            Case "__InstanceDeletionEvent"
                MsgBox "A file was just deleted: " & _
                    objEventObject.TargetInstance.PartComponent
            Case "__InstanceModificationEvent"
                MsgBox "A file was just modified: " & _
                    objEventObject.TargetInstance.PartComponent
        End Select
    Loop
Exit Sub
timeout:
    If Trim(Err.Source) = "SWbemEventSource" And Trim(Err.Description) = "Timed out" Then
        MsgBox "no events in the last 1 sec"
    Else
        MsgBox "ERROR watching"
    End If
End Sub

Kopieren Sie diese Unterseite und fügen Sie sie neben der obigen ein. Sie wird automatisch aufgerufen, wenn sie benötigt wird, um die globalen Variablen zu initialisieren.

Sub InitWatch()
On Error GoTo initerr
    Dim watchSecs As Integer, watchPath As String
    watchSecs = 1 'look so many secs behind'
    watchPath = "c:\\\\scripts" 'look for changes in this dir'

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
        ("SELECT * FROM __InstanceOperationEvent WITHIN " & watchSecs & " WHERE " _
            & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
                & "TargetInstance.GroupComponent= " _
                    & "'Win32_Directory.Name=""c:\\\\scripts""'")

    MsgBox "init done"
Exit Sub
initerr:
    MsgBox "ERROR during init - " & Err.Source & " -- " & Err.Description
End Sub

1voto

stuartd Punkte 65785

Sie sollten in Erwägung ziehen, einen temporären WMI-Ereignisverbraucher zu verwenden, um die Datei zu überwachen, und zwar nach folgendem Muster aquí aber die Eingrenzung auf eine bestimmte Datei statt auf einen Ordner

(Dies setzt voraus, dass Sie nicht einfach die Eigenschaft "Änderungsdatum" der Datei im Auge behalten können )

1voto

Wim Coenen Punkte 64891

Schauen Sie mal aquí . Die Seite enthält ein VB-Beispiel "Watch Directory Demo" von Bryan Stafford.

0voto

hack0573 Punkte 1

Ich nehme es in vb6,run,display:ERROR beobachten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X