关闭

(转)FindFirstChangeNotification,创建一个文件通知对象,该对象用于监视文件系统发生的变化

880人阅读 评论(0) 收藏 举报
分类:

FindFirstChangeNotification

VB声明
Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
说明
创建一个文件通知对象。该对象用于监视文件系统发生的变化
返回值
Long,如成功,返回一个改变通知对象的句柄;INVALID_HANDLE_VALUE表示失败。会设置GetLastError
参数表
参数 类型及说明
lpPathName String,要监视的目录
bWatchSubtree Long,如果为TRUE,表示监视lpPathName的所有子目录
dwNotifyFilter Long,带有前缀FILE_NOTIFY_CHANGE_???前缀的一个或多个常数,它们指定了对象发出信号的条件
注解

FindCloseChangeNotification函数关闭句柄,不要用CloseHandle函数

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>

void RefreshDirectory(LPTSTR);
void RefreshTree(LPTSTR);

void WatchDirectory(LPTSTR lpDir)
{
   DWORD dwWaitStatus; 
   HANDLE dwChangeHandles[2]; 
   TCHAR lpDrive[4];
   TCHAR lpFile[_MAX_FNAME];
   TCHAR lpExt[_MAX_EXT];

   _tsplitpath(lpDir, lpDrive, NULL, lpFile, lpExt);

   lpDrive[2] = (TCHAR)'//';
   lpDrive[3] = (TCHAR)'/0';
 
// Watch the directory for file creation and deletion. 
 
   dwChangeHandles[0] = FindFirstChangeNotification( 
      lpDir,                         // directory to watch 
      FALSE,                         // do not watch subtree 
      FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes 
 
   if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) 
      ExitProcess(GetLastError()); 
 
// Watch the subtree for directory creation and deletion. 
 
   dwChangeHandles[1] = FindFirstChangeNotification( 
      lpDrive,                       // directory to watch 
      TRUE,                          // watch the subtree 
      FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir. name changes 
 
   if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) 
      ExitProcess(GetLastError()); 
 
// Change notification is set. Now wait on both notification 
// handles and refresh accordingly. 
 
   while (TRUE) 
   { 
   // Wait for notification.
 
      dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, 
         FALSE, INFINITE); 
 
      switch (dwWaitStatus) 
      { 
         case WAIT_OBJECT_0: 
 
         // A file was created or deleted in the directory.
         // Refresh this directory and restart the notification.
 
            RefreshDirectory(lpDir); 
            if ( FindNextChangeNotification( 
                    dwChangeHandles[0]) == FALSE ) 
                ExitProcess(GetLastError()); 
            break; 
 
         case WAIT_OBJECT_0 + 1: 
 
         // A directory was created or deleted in the subtree.
         // Refresh the tree and restart the notification.
 
            RefreshTree(lpDrive); 
            if (FindNextChangeNotification( 
                    dwChangeHandles[1]) == FALSE) 
                ExitProcess(GetLastError()); 
            break; 
 
        default: 
            ExitProcess(GetLastError()); 
      }
   }
}

void RefreshDirectory(LPTSTR lpDir)
{
   _tprintf(TEXT("Refresh the directory (%s)./n"), lpDir);
}

void RefreshTree(LPTSTR lpDrive)
{
   _tprintf(TEXT("Refresh the directory tree (%s)./n"), lpDrive);
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
from msdn: Monitoring Changes in a Directory or Directory Tree The following example monitors the directory tree starting at C:/ for directory name changes. It also monitors the C:/WINDOWS directory for file name changes.  The example uses the FindFirstChangeNotification function to create two notification handles and the WaitForMultipleObjects function to wait on the handles. Whenever a directory is created or deleted in the tree starting at C:/ , the example updates the entire directory tree. Whenever a file is created or deleted in the C:/WINDOWS directory, the example refreshes the WINDOWS directory. The FindNextChangeNotification function restarts the change notification each time the example processes a change.  DWORD dwWaitStatus;  HANDLE dwChangeHandles[2];    // Watch the C:/WINDOWS directory for file creation and  // deletion.    dwChangeHandles[0] = FindFirstChangeNotification(      "C://WINDOWS",                 // directory to watch      FALSE,                         // do not watch the subtree      FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes    if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)      ExitProcess(GetLastError());    // Watch the C:/ subtree for directory creation and  // deletion.    dwChangeHandles[1] = FindFirstChangeNotification(      "C://",                        // directory to watch      TRUE,                          // watch the subtree      FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir. name changes    if (dwChangeHandles[1] == INVALID_HANDLE_VALUE)      ExitProcess(GetLastError());    // Change notification is set. Now wait on both notification  // handles and refresh accordingly.    while (TRUE)  {        // Wait for notification.       dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles,          FALSE, INFINITE);        switch (dwWaitStatus)      {          case WAIT_OBJECT_0:            // A file was created or deleted in C:/WINDOWS.          // Refresh this directory and restart the          // change notification. RefreshDirectory is an          // application-defined function.                RefreshDirectory("C://WINDOWS")              if ( FindNextChangeNotification(                      dwChangeHandles[0]) == FALSE )                  ExitProcess(GetLastError());              break;            case WAIT_OBJECT_0 + 1:            // A directory was created or deleted in C:/.          // Refresh the directory tree and restart the          // change notification. RefreshTree is an          // application-defined function.                RefreshTree("C://");              if (FindNextChangeNotification(                      dwChangeHandles[1]) == FALSE)                  ExitProcess(GetLastError());              break;            default:              ExitProcess(GetLastError());      }  }

转自:http://blog.csdn.net/zhaoyawei/article/details/742276

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1671299次
    • 积分:10185
    • 等级:
    • 排名:第1650名
    • 原创:43篇
    • 转载:682篇
    • 译文:0篇
    • 评论:78条
    最新评论