使用 FindFirstChangeNotificationFindNextChangeNotification API 函数在 VB6 中实现目录更改监控是另一种方式,这相对更简单一些。下面是一个示例,展示如何使用这些函数来监视目录的更改。

首先,我们需要声明所需的 Windows API 函数和常量:

' 模块: Module1.bas
Option Explicit

' Windows API 常量
Public Const FILE_NOTIFY_CHANGE_FILE_NAME As Long = &H1
Public Const FILE_NOTIFY_CHANGE_DIR_NAME As Long = &H2
Public Const FILE_NOTIFY_CHANGE_ATTRIBUTES As Long = &H4
Public Const FILE_NOTIFY_CHANGE_SIZE As Long = &H8
Public Const FILE_NOTIFY_CHANGE_LAST_WRITE As Long = &H10
Public Const FILE_NOTIFY_CHANGE_SECURITY As Long = &H100

' Windows API 函数声明
Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" ( _
    ByVal lpPathName As String, _
    ByVal bWatchSubtree As Long, _
    ByVal dwNotifyFilter As Long) As Long

Private Declare Function FindNextChangeNotification Lib "kernel32" ( _
    ByVal hChangeHandle As Long) As Long

Private Declare Function FindCloseChangeNotification Lib "kernel32" ( _
    ByVal hChangeHandle As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" ( _
    ByVal hHandle As Long, _
    ByVal dwMilliseconds As Long) As Long

' Windows API 常量
Public Const WAIT_OBJECT_0 As Long = 0
Public Const INFINITE As Long = &HFFFFFFFF

' 变化通知句柄
Private hChangeHandle As Long
Private bWatching As Boolean

Public Sub StartWatching(ByVal sPath As String)
    ' 初始化变化通知
    hChangeHandle = FindFirstChangeNotification(sPath, 1, _
        FILE_NOTIFY_CHANGE_FILE_NAME Or FILE_NOTIFY_CHANGE_DIR_NAME Or _
        FILE_NOTIFY_CHANGE_ATTRIBUTES Or FILE_NOTIFY_CHANGE_SIZE Or _
        FILE_NOTIFY_CHANGE_LAST_WRITE Or FILE_NOTIFY_CHANGE_SECURITY)
    
    If hChangeHandle = -1 Then
        MsgBox "无法开始监控。", vbCritical
        Exit Sub
    End If
    
    bWatching = True
    
    ' 开始监控
    Do While bWatching
        Dim dwWaitStatus As Long
        dwWaitStatus = WaitForSingleObject(hChangeHandle, INFINITE)
        
        Select Case dwWaitStatus
            Case WAIT_OBJECT_0
                ' 检测到变化
                Debug.Print "检测到目录变化。"
                
                ' 处理变化后继续监控
                If FindNextChangeNotification(hChangeHandle) = 0 Then
                    MsgBox "无法继续监控。", vbCritical
                    Exit Do
                End If
        End Select
    Loop
End Sub

Public Sub StopWatching()
    If hChangeHandle <> 0 Then
        bWatching = False
        FindCloseChangeNotification(hChangeHandle)
        hChangeHandle = 0
    End If
End Sub

在这个示例中,我们使用 FindFirstChangeNotification 来启动目录监视,并使用 WaitForSingleObject 来等待目录中的更改。当检测到更改时,打印一条消息并继续监控。

下面是如何使用这些子过程的示例:

' 窗体代码: Form1.frm
Private Sub Form_Load()
    ' 启动监控
    StartWatching "C:\监控目录"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' 停止监控
    StopWatching
End Sub

Form_Load 事件中启动目录监控,在 Form_Unload 事件中停止监控。请确保替换 "C:\监控目录" 为您想要监控的实际目录路径。

这个示例是一个简单的监控实现,可以根据需要进行扩展,例如添加更详细的变化处理逻辑、错误处理等。请注意,VB6 中的多线程和异步处理能力有限,因此在处理实际应用时需要考虑这些限制。

Views: 48

Hi, I’m 邓伟

本来无一物,何处惹尘埃