كيف أعرف متى تم تعديل ملف في ماكرو VBA؟
-
22-09-2019 - |
سؤال
هل هناك طريقة لمشاهدة ملف في 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 ، تشغيل ، عرض: مشاهدة خطأ.