سؤال

هل هناك طريقة لمشاهدة ملف في VBA (وهو VB6 بشكل أساسي) ، بحيث أعرف متى تم تعديل الملف؟ -- مشابه ل هذه أنا فقط لا أريد أن أعرف متى يوجد ملف غير مستعمل, ، فقط عندما يكون تم التعديل.

أوصت الإجابات التي وجدتها باستخدام "FilesystemWatcher" و Win32 API "FindFirstChangenotification". لا يمكنني معرفة كيفية استخدامها على الرغم من أي فكرة؟

هل كانت مفيدة؟

المحلول

حسنًا ، قمت بتجميع حل قادر على اكتشاف تغييرات نظام الملفات ، في 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

انسخ هذا الفرع بالقرب من ما ورد أعلاه ، يسمى تلقائيًا إذا لزم الأمر لتهيئة VARS العالمية.

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

نصائح أخرى

يجب أن تفكر في استخدام مستهلك حدث مؤقت لـ WMI لمشاهدة الملف ، على طول السطور المقترحة هنا لكن تضييقه إلى ملف معين بدلاً من مجلد

(هذا يفترض أنه لا يمكنك مراقبة خاصية تاريخ الملف المعدلة ..)

الق نظرة هنا. تحتوي الصفحة على عينة "Watch Directory Demo" VB ، من تأليف Bryan Stafford.

أنا آخذها إلى VB6 ، تشغيل ، عرض: مشاهدة خطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top