Уведомление об изменении файловой системы


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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.