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