FileDetect.bas
Upload User: wintows
Upload Date: 2009-11-16
Package Size: 27k
Code Size: 4k
Category:

Windows Develop

Development Platform:

Visual Basic

  1. Attribute VB_Name = "FileDetect"
  2. 'Download by http://www.codefans.net
  3. 'Module
  4. Option Explicit
  5. Public Const INFINITE = &HFFFF
  6. Public Const FILE_NOTIFY_CHANGE_FILE_NAME As Long = &H1
  7. Public Const FILE_NOTIFY_CHANGE_DIR_NAME As Long = &H2
  8. Public Const FILE_NOTIFY_CHANGE_ATTRIBUTES As Long = &H4
  9. Public Const FILE_NOTIFY_CHANGE_SIZE As Long = &H8
  10. Public Const FILE_NOTIFY_CHANGE_LAST_WRITE As Long = &H10
  11. Public Const FILE_NOTIFY_CHANGE_LAST_ACCESS As Long = &H20
  12. Public Const FILE_NOTIFY_CHANGE_CREATION As Long = &H40
  13. Public Const FILE_NOTIFY_CHANGE_SECURITY As Long = &H100
  14. Public Const FILE_NOTIFY_FLAGS = FILE_NOTIFY_CHANGE_ATTRIBUTES Or _
  15.                                  FILE_NOTIFY_CHANGE_FILE_NAME Or _
  16.                                  FILE_NOTIFY_CHANGE_LAST_WRITE
  17. Declare Function FindFirstChangeNotification Lib "kernel32" _
  18.     Alias "FindFirstChangeNotificationA" _
  19.    (ByVal lpPathName As String, _
  20.     ByVal bWatchSubtree As Long, _
  21.     ByVal dwNotifyFilter As Long) As Long
  22. Declare Function FindCloseChangeNotification Lib "kernel32" _
  23.    (ByVal hChangeHandle As Long) As Long
  24. Declare Function FindNextChangeNotification Lib "kernel32" _
  25.    (ByVal hChangeHandle As Long) As Long
  26. Declare Function WaitForSingleObject Lib "kernel32" _
  27.    (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
  28. Public Const WAIT_OBJECT_0 = &H0
  29. Public Const WAIT_ABANDONED = &H80
  30. Public Const WAIT_IO_COMPLETION = &HC0
  31. Public Const WAIT_TIMEOUT = &H102
  32. Public Const STATUS_PENDING = &H103
  33. 'Form   ,Add three Button controls,one listbox control,two label controls for Form
  34. Dim hChangeHandle As Long
  35. Dim hWatched As Long
  36. Dim terminateFlag As Long
  37. Public Sub WatchDIR_End()
  38.    If hWatched > 0 Then Call WatchDelete(hWatched)
  39.    hWatched = 0
  40.    
  41.    
  42. End Sub
  43. Public Sub WatchDIR_Start(watchPath As String)
  44.     Dim r As Long
  45.     'Dim watchPath As String
  46.     Dim watchStatus As Long
  47.     terminateFlag = False
  48.     WatchChangeAction watchPath
  49.     MsgBox "现在将开始检视文件夹 " & watchPath & " .. 单击 OK", vbInformation, "提示"
  50.     hWatched = WatchCreate(watchPath, FILE_NOTIFY_FLAGS)
  51.     watchStatus = WatchDirectory(hWatched, 100)
  52.     If watchStatus = 0 Then
  53.         WatchChangeAction watchPath
  54.         MsgBox "当前检视的文件夹已经发生过改变. 继续检视 Resuming watch...", vbInformation, "提示"
  55.         Do
  56.             watchStatus = WatchResume(hWatched, 100)
  57.             If watchStatus = -1 Then
  58.                 MsgBox "检视的文件夹已经终止 " & watchPath, vbInformation, "提示"
  59.             Else
  60.                 WatchChangeAction watchPath
  61.                 MsgBox "检视的文件夹再次发生改变.", vbInformation, "提示"
  62.             End If
  63.             DoEvents
  64.         Loop While watchStatus = 0
  65.     Else
  66.         ' MsgBox "Watching has been terminated for " & watchPath
  67.     End If
  68. End Sub
  69. Private Function WatchCreate(lpPathName As String, flags As Long) As Long
  70.    WatchCreate = FindFirstChangeNotification(lpPathName, False, flags)
  71. End Function
  72. Private Sub WatchDelete(hWatched As Long)
  73.    Dim r As Long
  74.    terminateFlag = True
  75.    DoEvents
  76.    r = FindCloseChangeNotification(hWatched)
  77. End Sub
  78. Private Function WatchDirectory(hWatched As Long, interval As Long) As Long
  79.    Dim r As Long
  80.    Do
  81.       r = WaitForSingleObject(hWatched, interval)
  82.       DoEvents
  83.    Loop While r <> 0 And terminateFlag = False
  84.    WatchDirectory = r
  85. End Function
  86. Private Function WatchResume(hWatched As Long, interval) As Boolean
  87.    Dim r As Long
  88.    r = FindNextChangeNotification(hWatched)
  89.    Do
  90.       r = WaitForSingleObject(hWatched, interval)
  91.       DoEvents
  92.    Loop While r <> 0 And terminateFlag = False
  93.    WatchResume = r
  94. End Function
  95. Private Sub WatchChangeAction(fPath As String)
  96.    Dim fName As String
  97.    'List1.Clear
  98.    fName = Dir(fPath & "" & "*.txt")
  99.    If fName > "" Then
  100.    '   List1.AddItem "path: " & vbTab & fPath
  101.    '   List1.AddItem "file: " & vbTab & fName
  102.    '   List1.AddItem "size: " & vbTab & FileLen(fPath & "" & fName)
  103.    '   List1.AddItem "attr: " & vbTab & GetAttr(fPath & "" & fName)
  104.    End If
  105. End Sub