15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

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