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()); } }