Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функции для работы с объектом «уведомление об изменении файловой системы»

Поиск

Для создания объекта «уведомление об изменении файловой системы» применяется функция FindFirstChangeNotification:

function FindFirstChangeNotification(lpPathName: PChar;

bWatchSubtree: BOOL; dwNotifyFilter: DWORD): THandle;

где lpPathName – указывает стартовый каталог. Можно указать как корневой каталог диска, так и любой подкаталог. Указав подкаталог, приложение уже не получит уведомлений о событиях, происшедших в «вышестоящих» каталогах. Для наблюдения за деревьями каталогов, расположенных на разных дисках, надо сделать несколько вызовов FindFirstChangeNotification — по одному на каждый исследуемый диск.

bWatchSubtree – сообщает системе, нужно ли наблюдать и за подка­талогами, входящими в каталог lpPathName. Если он равен FALSE, то посылаются уведомления лишь о событиях, происшедших непосредственно в указанном ка­талоге.

dwNotifyFilter: – указывает тип интересующих изменений и представ­ляет собой набор флагов, комбинируемых побитовой операцией OR. Возможные значения параметра fdwFilter приведены в таблице 9. 1.

Таблица 9.1 Возможные значения апраметра 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 Изменение дескриптора защиты (security descriptor) файла или каталога.

Система часто прибегает к буферизации изменений в файле, пример, размер файла не изменяется до тех пор, пока информация из буфера не переписана на диск. Уведомление об изменении размера файла отправляет только после фактической записи данных на диск, а не после их модификации программой.

При успешном завершении FindFirstChangeNotification возвращает дескриптор, который программа может использовать при вызове таких синхронизирующих функций, как WaitForSingleObject или WaitForMultipleObjects. Если FindFirstChangeNotification передан неверный параметр (например, путь к исследуемому каталогу), функция возвращает INVALID_HANDLE_VALUE.

Для перевода объекта «уведомление об изменении файловой системы» применяется функция FindNextChangeNotification:

function FindNextChangeNotification(hChangeHandle: THandle): BOOL;

где hChangeHandle – дескриптор объекта «уведомление об изменении файловой системы», созданного функцией FindFirstChangeNotification. При успешном выполнении функция FindNextChangeNotification возвращает значение TRUE.

Для закрытия объекта «уведомление об изменении файловой системы» применяется функция FindCloseChangeNotification:

function FindCloseChangeNotification(hChangeHandle: THandle): BOOL;

где hChangeHandle – дескриптор объекта «уведомление об изменении файловой системы», созданного функцией FindFirstChangeNotification. При успешном выполнении функция FindCloseChangeNotification возвращает значение TRUE.

Для просмотра файлов и каталогов используются функции FindFirst и FindNext.

Функция FindFirst выделяет в памяти необходимые ресурсы для поиска файлов в каталоге и имеет вид:

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

где Path – определяет шаблон поиска. Например, если параметр Path равен '.\test\*.*', то будет осуществляться поиск всех файлов в каталоге test.

Attr – определяет атрибуты файлов, для которых производится поиск. Возможные значения атрибутов приведены в таблице 9.2. Атрибуты можно комбинировать с помощью операции логического «ИЛИ» («or»).

F – структура TSearchRec, в которую при успешном выполнении функции заносятся результаты поиска. Структура TSearchRec имеет вид:

TSearchRec = record

Time: Integer; // Время последнего изменения файла

Size: Integer; //Размер файла

Attr: Integer; //Атрибуты файла

Name: TFileName; //Имя и расширение файла

ExcludeAttr: Integer;

FindHandle: THandle; // Дескриптор файла

FindData: TWin32FindData; //Дополнительная информация.

end;

Таблица 9.2 Возможные значения атрибутов в поле Attr

Атрибут Описание
faReadOnly Файл только для чтения
faHidden Скрытый файл
faSysFile Системный файл
faVolumeID Идентификатор диска
faDirectory Каталог
faArchive Архивный файл
faAnyFile Любой файл

Функция FindNext имеет вид:

function FindNext(var F: TSearchRec): Integer;

Данная функция продолжает поиск, начатый функцией FindFirst. Если нашелся новый файл, функция FindNext возвращает 0, в противном случае – код ошибки Windows. Результаты поиска заносятся в запись TSearchRec.

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

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

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

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

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

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

var

Form1: TForm1;

DirName:String;

Implementation

 

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

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

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

     
  DriveComboBox1 (Страница Win3.1палитры компонентов) Компонент предназначен для выбора драйвера (диска)
  DirectoryListBox1(Страница Win3.1палитры компонентов) Компонент пердназначен для выбора каталога, в котором будут отслеживаться изменения файловой системы
  ListBox1 Дополнительный поток будет записывать в этот список содержимое каталога при обнаружении изменений.
  Label1 Метка «Выбор диска и каталога»
  Label2 Метка «Содержимое выбранного каталога»

 

4. Для отслеживания изменений в каком-либо каталоге создайте дополнительный поток 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;

 

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

procedure TForm1.DriveComboBox1Change(Sender: TObject);

begin

DirectoryListBox1.Drive:= DriveComboBox1.Drive;

end;

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

 

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

procedure TForm1.DirectoryListBox1Change(Sender: TObject);

begin

Dirname:=DirectoryListBox1.Directory;

end;

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

 

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

procedure TForm1.DirectoryListBox1Click(Sender: TObject);

begin

Dirname:=DirectoryListBox1.Directory;

end;

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

 

8. Для события 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;

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

9.4. Задания для самостоятельной работы

Создайте приложение, которое отслеживает изменения файловой системы и выводит на экран список измененных файлов и каталогов:

1. Создание, переименование и удаление файлов или каталогов.

2. Создание, переименование, удаление и изменение атрибутов файлов.

3. Создание, переименование, удаление файлов и изменение времени последней записи в файл.

4. Создание, переименование, удаление файлов и изменение размера файла.

5. Создание, переименование и удаление каталогов, а также изменение атрибутов файлов.

6. Изменение атрибутов файлов, времени последней записи в файл и размеров файлов.

7. Изменение времени последней записи в файл и.создание, удаление, изменение каталогов.

8. Изменение атрибутов файлов и размера файла.

9. Создание, переименование и удаление каталогов.

10. Создание, переименование и удаление файлов или каталогов в нескольких выбранных каталогах.

11. Создание, переименование, удаление и изменение атрибутов файлов в нескольких выбранных каталогах.

12. Создание, переименование, удаление файлов и изменение времени последней записи в файл в нескольких выбранных каталогах.

13. Создание, переименование, удаление файлов и изменение размера файла в нескольких выбранных каталогах.

14. Создание, переименование, удаление файлов и изменение размера файла в нескольких выбранных каталогах.

15. Изменение атрибутов файлов, времени последней записи в файл и размеров файлов в нескольких выбранных каталогах.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. С помощью какой функции создается объект «уведомление об изменении файла»?

2. С помощью каких функций отслеживаются изменения файловой системы?

3. Какая функция переводит объект «уведомление об изменении файла» в занятое состояние?

4. Когда объект «уведомление об изменении файла» переходит в свободное состояние?

5. Как отследить изменения файловой системы в нескольких каталогах?

ЛИТЕРАТУРА

1. В.Г. Олифер, Н.А. Олифер Сетевые операционные системы. - СПб.: Издательство "Питер", 2008. - 544 с. ил.

2. Гордеев А.В. Операционные системы. Учебник для вузов.2-е изд. -СПб.: "Питер", 2007. -416 с: ил.

3. Рихтер Дж. Windows для профессионалов. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows – СПб: Издательство "Питер" Русская редакция, 2006. 752 с:ил.

 

СОДЕРЖАНИЕ

ВВЕДЕНИЕ. 3

1. ЛАБОРАТОРНАЯ РАБОТА № 1. 4

1.1. Цель работы.. 4

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

1.2.1. Получение информации об операционной системе. 4

1.2.2. Получение информации из реестра. 5

1.2.3. Получение информации о системных каталогах Windows. 6

1.2.4. Получение информации о диске. 6

1.3. Создание приложения для получения характеристик компьютера и операционной системы.. 8

2. ЛАБОРАТОРНАЯ РАБОТА №2. 12

2.1.Цель работы.. 12

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

2.2.1. Процедуры и функции для работы с виртуальной памятью.. 12

2.3. Создание приложения, работающего с виртуальной памятью.. 19

2.4. Задание для самостоятельной работы.. 24

3. ЛАБОРАТОРНАЯ РАБОТА № 3. 25

3.1. Цель работы.. 25

3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач. 25

3.3. Задания для самостоятельной работы.. 26

4. ЛАБОРАТОРНАЯ РАБОТА № 4. 30

4.1. Цель работы.. 30

4. 2. Теоретическое введение. 31

4.2.1 Создание или открытие объекта ядра «файла». 31

4.2.2 Создание объекта ядра «файл, проецируемый в память». 33

4.2.3 Проецирование файловых данных на адресное пространство процесса 34

4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память». 35

4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл» 36

4.3 Примеры программ, выполняющих проецирование в память. 36

4.3.1 Пример 1. 36

4.3.2 Пример 2. 37

4.4. Задания для самостоятельной работы.. 38

5. ЛАБОРАТОРНАЯ РАБОТА № 5. 39

5.1.Цель работы.. 40

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

5.2.1. Создание процесса. 40

5.2.2. Запуск внешней программы функцией WinExec. 42

5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute 43

При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec. 44

5.2.4. Создание потока. 45

5.2.5. Завершение процесса. 46

5.2.6. Завершение потока. 47

5.2.7. Изменение класса приоритета процесса. 47

5.2.8. Получение информации о классе приоритета процесса. 47

5.2.9. Изменение уровня приоритета потока. 48

5.2.10. Получение информации о приоритете потока. 48

5.3. Примеры программ для работы с процессами и потоками. 49

5.3.1. Создание процесса с помощью функции CreateProcess. 49

5.3.2. Создание процесса с помощью функции WinExec. 49

5.3.3. Создание процесса с помощью функции ShellExecute. 50

5.3.4. Создание многопоточного приложения. 50

5.4. Задания для самостоятельной работы.. 51

6. ЛАБОРАТОРНАЯ РАБОТА № 6. 54

6.1. Цель работы.. 54

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

6.2.1. Получение «мгновенного снимка» системы.. 54

6.2.2. Получение информации о процессах. 55

6.2.3. Получение информации о потоках. 57

6.2.4. Получение информации о модулях. 57

6.2.5. Информация о кучах (heap) 59

6.2.6. Информация о виртуальной памяти. 60

6.2.7. Алгоритм работы функций ToolHelp. 61

6.2.8. Как получить карту памяти любого процесса. 61

6.3. Пример использования функций ToolHelp. 63

6.4. Задания для самостоятельной работы.. 66

7. ЛАБОРАТОРНАЯ РАБОТА № 7. 68

7.1. Цель работы.. 68

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

7.2.1. Критические секции. 68

7.2.2. Синхронизация с использованием объектов ядра. 69

7.2.3. Wait-функции. 70

7.2.4. Синхронизация с использованием процессов и потоков. 71

7.2.5. Объекты Mutex. 71

7.2.6. Семафоры.. 73

7.2.7. События. 75

7.3 Примеры работы с объектами синхронизации. 77

7.3.1 Пример 1. 77

7.3.1 Пример 2. 83

7.4. Задания для самостоятельной работы.. 86

8. ЛАБОРАТОРНАЯ РАБОТА № 8. 90

8.1. Цель работы.. 90

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

8.2.1 Создание DLL. 91

8.2.2 Неявная загрузка DLL. 92

8.2.3 Явная загрузка DLL. 93

8.2.4 Внедрение DLL в адресное пространство другого процесса. 94

8.3 Пример работы с DLL. 96

8.3.1 Создание DLL, которая выполняет перехват нажатых клавиш.. 96

8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш. 97

8.4 Индивидуальные задания. 100

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

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

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

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

9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы». 106

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

9.4. Задания для самостоятельной работы.. 112

ЛИТЕРАТУРА.. 113

 

 

Учебно – методическое пособие

 

Малахов Владимир Викторович

Малашенкова Елена Александровна

Панкратова Елена Александровна

Семенова Ольга Всеволодовна

 

Программирование приложений с использованием windows API

 

Технический редактор М.А. Андреев

Корректор Л.И. Чурлина

 

 

Темплан издания филиала ФГБОУ ВПО «НИУ МЭИ» в г. Смоленске, 2012г., метод.

Подписано к печати 2011

Формат Тираж 25 экз. Печ.л. Усл.печ.л.

 

 

Издательский сектор филиала ФГБОУ ВПО «НИУ МЭИ» в г. Смоленске,

214013 г. Смоленск, Энергетический проезд, 1

 

 



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 316; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.201.46 (0.008 с.)