Уведомление об изменении файловой системы
FindFirstChangeNotification
FindNextChangeNotification
FindCloseChangeNotification
Функция FindFirstChangeNotification создаёт описатель объекта ядра "уведомление", с помощью которого можно отслеживать заданные фильтром изменения в директории или её поддереве. При выполнении заданного условия (например, появления новых файлов, переименования файлов, изменение их размеров или аттрибутов и т.п.) объект приходит в сигнальное состояние, что можно отследить какой-нибудь wait-функцией. После первого изменения можно продолжить ожидание (т.е. по сути вернуть "уведомление" в несигнальное состояние и направить к ожиданию изменений) с помощью функции FindNextChangeNotification. После завершения слежения необходимо вызывать функцию FindCloseChangeNotification, чтобы освободить объект ядра "уведомление".
HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, //Путь к директории, изменения в которой будут отслеживаться
BOOL bWatchSubtree, //Флаг, указывающий просматривать ли поддерево каталога
DWORD dwNotifyFilter //Фильтр, т.е указание, что именно отслеживать
);
BOOL FindNextChangeNotification(
HANDLE hChangeHandle //Описатель "уведомления", полученный из предыдущей функции
);
BOOL FindCloseChangeNotification(
HANDLE hChangeHandle //Описатель "уведомления"
);
Рассмотрим подробнее некоторые параметры функции FindFirstChangeNotification:
dwNotifyFilter - в этом параметре можно указать одну из определённого списка констант или и комбинацию, если фильтров требуется наложить несколько. Это могут быть следующие константы: FILE_NOTIFY_CHANGE_FILE_NAME, FILE_NOTIFY_CHANGE_DIR_NAME, FILE_NOTIFY_CHANGE_ATTRIBUTES, FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE, FILE_NOTIFY_CHANGE_SECURITY.
Пример:
HANDLE hNotification= FindFirstChangeNotification(g_strInFolder, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); //Начинаем отслеживать изменения в заданной папке посредством специальной функции
if (hNotification==INVALID_HANDLE_VALUE) //Если создать описатель не удалось, значит заданного пути не существует
{
MessageBox (NULL, "Wrong path", "Error", MB_OK);
return -1;
}
HANDLE pHandles[2]; //Объявляем массив описателей для функции WaitForMultipleObjects
pHandles[0]= g_hStopEvent; //Одним элементом будет событие (нажатие кнопки "стоп")
pHandles[1]= hNotification; //Другим - наш описатель, отслеживающий изменения в папке
while(1) //Бесконечный цикл
{
DWORD dwResult= WaitForMultipleObjects(2, pHandles, FALSE, INFINITE); //Ждём
if (dwResult==WAIT_OBJECT_0) //Нажата кнопка "стоп" - выходим из цикла
break;
//...
FindNextChangeNotification(hNotification); //И включаем ожидание следующего изменения в папке
}//while (1)
FindCloseChangeNotification(hNotification);
В следующей таблице суммируются сведения о различных объектах ядра применительно к синхронизации потоков.
Объект | Находится в занятом состоянии, когда | Переходит в свободное состояние, когда | Побочный эффект успешного ожидания |
Процесс Поток | процесс еще активен поток еще активен | процесс завершается (ExitProcess, TerminateProcess) поток завершается (ExitThread, TerminateThread) | Нет Нет |
Объект | Находится в занятом состоянии, когда: | Переходит в свободное состояние, когда: | Побочный эффект успешного ожидания |
Задание | время, выделенное заданию, еще не истекло | время, выделенное заданию, истекло | Нет |
Файл | выдан запрос на ввод-вывод | завершено выполнение запроса на ввод-вывод | Нет |
Консольный ВВОД | ввода нет | ввод есть | Нет |
Уведомление об изменении файла | в файловой системе нет изменений | файловая система обнаруживает изменения | Сбрасывается в исходное состояние |
Событие с автосбросом | вызывается SetEvent или PulseEvent | Сбрасывается в исходное состояние | |
Событие со сбросом вручную | вызывается ResetEvent или PulseEvent | вызывается SetEvent или PulseEvent | Нет |
Ожидаемый таймер с автосбросом | вызывается CancelWaitable- Тiтеr или ожидание успешно завершилось | наступает время срабатывания (SetWaitableTimer) | Сбрасывается в исходное состояние |
Ожидаемый таймер со сбросом вручную | вызывается CancelWaitableTimer | наступает время срабатывания (SetWaitableTimef) | Нет |
Семафор | ожидание успешно завершилось | счетчик > 0 (ReleaseSemaphore) | Счетчик уменьшается на 1 |
Мьютекс | ожидание успешно завершилось | поток освобождает мьютекс (ReleaseMutex) | Передается пото ку во владение |
Критическая секция (поль зовательского режима) | ожидание успешно завершилось ( (Try)EnterCriticalSection) | поток освобождает критическую секцию (LeaveCriticalSection) | Передается потоку во владение |
Дата добавления: 2017-01-26; просмотров: 1708;