Отслеживание изменений в директории

Следующий пример отслеживает изменения названия директорий, начиная с C:\. Так же пример отслеживает изменения имён файлов в директории C:\WINDOWS. В примере используются две функции FindFirstChangeNotification и WaitForMultipleObjects - первая для создания двух нотификационных дескрипторов, а вторая для ожидания событий на этих дескрипторах. Так же в примере используется функция FindNextChangeNotification, которая перезапускает процес уведомлений.
DWORD dwWaitStatus;
HANDLE dwChangeHandles[2];

// дескриптор для отслеживания директории C:\WINDOWS на создание
// и удаление файлов.

dwChangeHandles[0] = FindFirstChangeNotification(
"C:\\WINDOWS", // директория для просмотра
FALSE, // не просматривать поддиректории
FILE_NOTIFY_CHANGE_FILE_NAME); // отслеживать изм. имён файлов

if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)
ExitProcess(GetLastError());

// дескриптор для отслеживания C:\ на создание и удаление
// директорий.

dwChangeHandles[1] = FindFirstChangeNotification(
"C:\\", // директория для просмотра
TRUE, // просматривать поддиректории
FILE_NOTIFY_CHANGE_DIR_NAME); // отслеживать изм. имён директорий

if (dwChangeHandles[1] == INVALID_HANDLE_VALUE)
ExitProcess(GetLastError());

// Итак, уведомления об изменениях установлены. Теперь ожидаем
// уведомления от дескрипторов и производим необходимое обновление.

while (TRUE)
{

// Ждём уведомления.

dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles,
FALSE, INFINITE);

switch (dwWaitStatus)
{
case WAIT_OBJECT_0:

// В C:/WINDOWS был создан или удалён файл.
// Обновляем эту директорию и перезапускаем уведомление.

RefreshDirectory("C:\\WINDOWS")
if ( FindNextChangeNotification(
dwChangeHandles[0]) == FALSE )
ExitProcess(GetLastError());
break;

case WAIT_OBJECT_0 + 1:

// В C:\ была создана или удалена директория.
// Обновляем дерево директории и перезапускаем уведомление.

RefreshTree("C:\\");
if (FindNextChangeNotification(
dwChangeHandles[1]) == FALSE)
ExitProcess(GetLastError());
break;

default:
ExitProcess(GetLastError());
}
}