Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

Контрольные вопросы

  1. Перечислите основные системные DLL ОС Windows.

  2. Сравните явную и неявную загрузку DLL.

  3. Что означают такие понятия, как «экспорт функции по имени» и «экспорт функции по номеру»?

  4. Для каких целей в исполняемом файле служит таблица экспорта и таблица импорта?

  5. В каких исполняемых файлах, как правило, отсутствует таблица экспорта.

9. ЛАБОРАТОРНАЯ РАБОТА № 9

ОТСЛЕЖИВАНИЕ ИЗМЕНЕНИЙ ФАЙЛОВОЙ СИСТЕМЫ

9.1. Цель работы

Целью данной работы изучение функций FindFirstChangeNotification и FindNextChangeNotification, с помощью которых можно отслеживать любые изменения файловой системы в выбранных каталогах. Выполнение данной работы предполагает, знание принципа работы Wait-функций, рассмотренных в лабораторной работе № 7.

9.2. Теоретическое введение

Многим программам необходимо узнавать об изменениях, происшед­ших в файловой системе. Например, стандартное Диалоговое окно File Open в Windows автоматически обновляет свое содер­жимое при любых изменениях в файловой системе.

Возможность динамического уведомления приложений об изменениях файловой системе требовалась столь часто, что в Windows введена прямая поддержка данной возможности.

9.2.1. Принцип работы системы уведомления об изменениях в файловой системе

Для получения информации об изменениях в файдовой системе необходимо выполнить следующие действия:

1. Сначала приложение вызовом FindFirstChangeNotification — сообщает системе о том, что оно заинтересовано в получении уведомлений.

Функция FindFirstChangeNotification никаких изменений не ищет, а просто создает объект «уведомление об изменении файла» и возвращает его дескриптор.

2. Получив дескриптор объекта «уведомление», можно использовать его в функциях WaitForSingleObject и WaitForMultipleObjects. Объект переходит в незанятое состояние всякий раз, когда в файловой системе происходит изменение, соответствующее критериям, указанным при вызове FindFirstChangeNotification.

Объект «уведомление об изменении файла» можно рассматривать как собы­тие со сбросом вручную, в которое встроена дополнительная логика: событие переходит в незанятое состояние при каком-либо изменении в файловой систе­ме. После возврата из WaitForSingleObject или WaitForMultipleObjects программа «понимает», что ей надо вновь просмотреть дерево каталогов и обновить информацию о файлах и каталогах.

Система накапливает информацию об изме­нениях и сообщает сразу обо всех. Например, если пользователь ввел команду: deltree чтобы удалить все файлы и подкаталоги в текущем каталоге, поток командного процессора успеет удалить как минимум несколько файлов, прежде чем система переведет объект «уведомление об изменении файла» в незанятое состояние и тем самым позволит программе, отслеживающей изменения, возобновить исполнение. Дескриптор этого объекта не переводится в свободное состояние при удалении каждого файла, что значительно повышает производительность системы.

3. Когда объект «уведомление об изменении файла» становится свободным. Программа, отслеживающая изменения, возобновляется и может выполнить любые нужные действия, закончив, она должен вызвать функцию FlndNextChangeNotification;

Эта функция сбрасывает объект-уведомление в занятое состояние. При просмотре дерева каталогов программа, выполняющая отслеживание изменений, может быть вытеснена потоком командного процессора, и тот продолжит изменение файлов и каталогов. Вызов FindNextChangeNotification позволит выяснить это обстоятельство, и, если с момента последнего перевода объекта-уведомления в незанятое состояние в файловой системе произошли новые изменения, объект-уведомление не сбрасывается в занятое состояние, оставаясь свободным.

Таким образом, если программа, отслеживающая изменения, снова ждет, когда объект станет незанятым, его ожидание немедленно прекращается, и он вновь «пройдет» по дереву каталогов. После каждого вызова FindNextChangeNotification следует обязательно ждать перевода объекта-уведомления в незанятое состояние. Иначе будут пропущены изменения в файловой системе.

4. Когда уведомления об изменениях файлов больше не нужны, следует закрыть объект-уведомление, вызвав: FindCloseChangeNotification.