Отслеживание изменений в директории
Следующий пример отслеживает изменения названия директорий, начиная с 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());
}
}