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

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

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

Для создания приложения выполните следующие действия:

  1. Создайте проект (New Application), экранная форма которого изображена на рисунке 9.1.

  2. Перенесите на форму компоненты, указанные в таблице 9.3.

  3. Введите глобальную переменную Dirname для хранения имени отслеживаемого каталога.

var

Form1: TForm1;

DirName:String;

Implementation

Таблица 9.3 Компоненты приложения для отслеживания изменений файловой системы

Компонент

Описание

1

2

3

1

Button1

Кнопка «Пуск». При нажатии на данную кнопку выбирается исследуемый каталог и запускается дополнительный поток для отслеживания изменений имен файлов в данном каталоге

Продолжение таблицы 9.3

1

2

3

2

DriveComboBox1 (Страница Win3.1палитры компонентов)

Компонент предназначен для выбора драйвера (диска)

3

DirectoryListBox1(Страница Win3.1палитры компонентов)

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

4

ListBox1

Дополнительный поток будет записывать в этот список содержимое каталога при обнаружении изменений.

5

Label1

Метка «Выбор диска и каталога»

6

Label2

Метка «Содержимое выбранного каталога»

  1. Для отслеживания изменений в каком-либо каталоге создайте дополнительный поток ChangeFS:

procedure changeFS;

var

r:Cardinal; {результат работы функции WaitForSingleObject }

fn:THandle; {дескриптор функции, отслеживающей изменение файловой системы}

Searchrec:TSearchRec; {Структура используется при поиске файлов}

Begin

// Сообщение ОС, о том, что приложение начинает отслеживать изменения

fn:=FindFirstChangeNotification(pchar(Dirname),True,FILE_NOTIFY_CHANGE_FILE_NAME);

repeat

// Ожидание изменений

r:=WaitForSingleObject(fn,2000);

If r=WAIT_OBJECT_0 then

Begin

// Если изменение произошло, на экран выводится новое содержимое каталога

Form1.ListBox1.Clear;

FindFirst(Form1.Edit1.text+'\*.*',faAnyFile,SearchRec);

repeat

Form1.ListBox1.Items.Add(Searchrec.Name);

until Findnext(Searchrec)<>0;

FindClose(SearChRec);

end;

// Если больше изменений не происходит, прервать процедуру отслеживания

If not FindNextChangeNotification(fn) then break;

until False;

FindCloseChangeNotification(fn);

end;

  1. Для события OnChange компонента DriveComboBox1 запишите следующий программный код:

procedure TForm1.DriveComboBox1Change(Sender: TObject);

begin

DirectoryListBox1.Drive:= DriveComboBox1.Drive;

end;

Данный оператор предназначен для настройки свойства Drive компонента DirectoryListBox1 на выбранный с помощью компонента DriveComboBox1 диск.

  1. Для события OnChange компонента DirectoryListBox1 запишите следующий программный код:

procedure TForm1.DirectoryListBox1Change(Sender: TObject);

begin

Dirname:=DirectoryListBox1.Directory;

end;

Данный оператор предназначен для сохранения в глобальной переменной Dirname выбранного каталога.

  1. Для события OnCLick компонента DirectoryListBox1 запишите следующий программный код:

procedure TForm1.DirectoryListBox1Click(Sender: TObject);

begin

Dirname:=DirectoryListBox1.Directory;

end;

Данный оператор предназначен для сохранения в глобальной переменной Dirname выбранного каталога. Пункт 7 дублирует пункт 6 и не является обязательным.

  1. Для события OnClick кнопки «Пуск» запишите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

VAR

pFunc:pointer;

ThreadID:CARDINAL;

hThread:THANDLE;

begin

// Запуск дополнительного потока для исследования

pFunc:=@ChangeFS;

hThread:=CreateThread(nil,0,pFunc,nil,0,ThreadID);

end;

  1. Откомпилируйте приложение и проверьте его работу.