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