Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2050

.pdf
Скачиваний:
0
Добавлен:
15.11.2022
Размер:
1.12 Mб
Скачать

FILE_ATIBUTE_ARCHIVE - архивный файл (допускает удаление и резервное копирование) задается автоматически при создании файла;

FILE_ATRIBUTE_HIDDEN - скрытый файл (не включается в обычный список каталога);

FILE_ATRIBUTE_NORMAL - нормальный файл (все остальные атрибуты отсутствуют);

FILE_ATRIBUTE_READONLY - только для чтения; FILE_ATRIBUTE_SYSTEM - системный (используется

операционной системой);

FILE_ATRIBUTE_COMPRESSED - сжатые файлы или каталоги;

FILE_ATRIBUTE_OFFLINE - файл отсутствует, но данные перенесены в хранилище;

FILE_ATRIBUTE_TEMPORARY - временный файл

(файловая система стремится поместить его в память, что ускорит доступ).

CloseHandle закрывает идентификатор управления, открытый функцией CreateFile.

Синтаксис: BOOL CloseHandle(hObject)

HANDLE hObject; // идентификатор для закрытия

ReadFile позволяет читать данные из файла, открытого функцией CreatеFile. Функция возвращает true при правильном ее выполнении.

Синтаксис: BOOL ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)

HANDLE hFile; // идентификатор управления открытого файла LPVOID lpBuffer; // указатель на буфер неопределенного типа для приема данных

DWORD nNumberOfBytesToRead; // какое количество байт необходимо считать

LPDWORD lpNumberOfBytesRead; // указатель на считанное количество байт

21

LPOVERLAPPED lpOverlapped; // указатель на структуру

Overlapped

структура Overlapped содержит информацию, используемую в асинхронном вводе-выводе.

WriteFile ведет запись в файл, открытый функцией CreatеFile. Функция возвращает true при правильном ее выполнении.

Синтаксис: BOOL WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped)

HANDLE hFile; // идентификатор управления открытого файла LPCVOID lpBuffer; // указатель на буффер неопределенного типа для записи данных

DWORD nNumberOfBytesToWrite; // количество байт для записи LPDWORD lpNumberOfBytesWritten; // указатель на записанное количество байт

LPOVERLAPPED lpOverlapped; // указатель на структуру

Overlapped

CopyFile копирует данные из существующего файла в новый файл с указанным именем. Функция возвращает true при правильном ее выполнении.

Синтаксис: BOOL CopyFile(lpExistingFile, lpNewFile, fFailIfExists)

LPCTSTR lpExistingFile; // указатель на существующий файл LPCTSTR lpNewFile; // указатель на имя файла для копирования BOOL fFailIfExists; // true - отмена функции, если файл для копирования уже существует (false - перезаписать)

MoveFile переносит/переименовывает файл с заданным именем. Функция возвращает true при правильном ее выполнении.

Синтаксис: BOOL MoveFile(lpExisting, lpNew)

LPCTSTR lpExisting; // указатель на имя существующего файла LPCTSTR lpNew; // указатель на новое имя файла

22

DeleteFile удаляет файл с заданным именем. Функция возвращает true при правильном ее выполнении.

Синтаксис: BOOL DeleteFile(lpFileName)

LPCTSTR lpFileName; // указатель на имя файла

По количеству управляющие функции превосходят информационные. Это естественно, так как, во-первых, выполнение той или иной операции может производиться с помощью разных функций с различными параметрами, а вовторых, выполнение разных по целевому назначению функций влечет за собой сходные изменения файловой системы. Так, например, при выполнении операций: копирования, перемещения, удаления и создания файла; для информационных функций значение имеет лишь присутствие либо отсутствие того или иного файла.

Управление файловой системой сводится к следующим основным действиям:

создание или удаление директории;

установка текущей директории;

установка атрибутов файла;

создание или удаление файла;

копирование файла;

переименование/перемещение файла;

чтение или запись файла.

Создание директории

Имя создаваемой директории берется из свойства Text компоненты Edit1. Окно "Сообщение" выводит результат выполнения функции.

TEdit *Edit1; void main()

{if (!CreateDirectory(Edit1->Text.c_str(),NULL))

MessageBox(NULL,"Ошибка создания директории!!!","Сообщение",MB_OK);

else MessageBox(NULL,"Директория создана успешно","Сообщение",MB_OK);}

23

Удаление директории

Имя удаляемой директории берется из свойства Text компоненты Edit1. При ошибке выводится сообщение.

TEdit *Edit1; void main()

{if (!RemoveDirectory(Edit1->Text.c_str()))

MessageBox(NULL,"Ошибка удаления директории!!!","Сообщение",MB_OK);}

Установка текущей директории

Имя устанавливаемой директории берется из свойства Text компоненты Edit1. При ошибке выводится сообщение.

TEdit *Edit1;

void main() MessageBox(NULL,"Ошибка изменения текущей

{if (!SetCurrentDirectory(Edit1->Text.c_str()))

директории!!!","Сообщение",MB_OK);}

Создание файла

Имя создаваемого файла берется из свойства Text компоненты Edit1. Окно "Сообщение" выводит результат выполнения функции.

TEdit *Edit1; void main ()

{

HANDLE hFile; hFile=CreateFile(Edit1-

>Text.c_str(),NULL,NULL,NULL,CREATE_NEW,NULL,NULL); if (hFile==INVALID_HANDLE_VALUE)

MessageBox(NULL,"Ошибка создания файла!!!","Сообщение",MB_OK);

else MessageBox(NULL,"Файл создан успешно","Сообщение",MB_OK);

CloseHandle(hFile);

}

Удаление файла

Имя удаляемого файла берется из свойства FileName компоненты OpenDialog1. При ошибке выводится сообщение.

24

TOpenDialog *OpenDialog1; void main()

{if (!DeleteFile(OpenDialog1->FileName.c_str()))

MessageBox(NULL,"Ошибка удаления файла!!!","Сообщение",MB_OK);}

Копирование файла

Имя исходного файла берется из свойства Text компоненты Edit1. Имя нового файла берется из свойства Text компоненты Edit2. Если файл с именем Edit2 уже существует - копирование не происходит.

TEdit *Edit1;

TEdit *Edit2; void main()

{if (!CopyFile(Edit1->Text.c_str(),Edit2->Text.c_str(),true))

MessageBox(NULL,"Ошибка копирования файла!!!","Сообщение",MB_OK);}

Перенос/переименование файла

Имя исходного файла берется из свойства Text компоненты Edit1. Новое имя файла берется из свойства Text компоненты Edit2. При ошибке выводится сообщение.

TEdit *Edit1;

TEdit *Edit2; void main()

{if (!MoveFile(Edit1->Text.c_str(),Edit2->Text.c_str()))

MessageBox(NULL,"Ошибка переименования/перемещения файла!!!","Сообщение",MB_OK);}

Чтение из файла

Имя считываемого файла берется из свойства Text компоненты Edit1. Компонентой Edit2 выводятся первые 6 байт файла в шестнадцатиричном формате.

TEdit *Edit1;

TEdit *Edit2; void main()

{

HANDLE hFile;

DWORD lpNumberOfBytesRead;

25

unsigned char num[6]; char chper[25]; hFile=CreateFile(Edit1-

>Text.c_str(),GENERIC_READ,NULL,NULL,OPEN_EXISTING,NULL, NULL);

if (hFile==INVALID_HANDLE_VALUE) MessageBox(NULL,"Ошибка открытия файла!!!","Сообщение",MB_OK);

else if (!ReadFile(hFile,num,6,&lpNumberOfBytesRead,NULL)) MessageBox(NULL,"Ошибка чтения из

файла!!!","Сообщение",MB_OK);

else for (int i=0;i<6&&i<lpNumberOfBytesRead;++i)

- Edit2->Text=Edit2->Text+CharUpper(itoa((int)num[i],chper,16))+"h ";

CloseHandle(hFile);

}

Запись в файл

Имя файла для записи берется из свойства Text компоненты Edit1. В начало файла записываются значения 1, 2, 3 , 4, 5.

TEdit *Edit1; HANDLE hFile;

DWORD lpNumberOfBytesWrite; char num[]={0,1,2,3,4,5};

void main()

{

hFile=CreateFile(Edit1- >Text.c_str(),GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL ,NULL);

if (hFile==INVALID_HANDLE_VALUE) MessageBox(NULL,"Ошибка открытия файла!!!","Сообщение",MB_OK);

else if (!WriteFile(hFile,num,6,&lpNumberOfBytesWrite,NULL))

MessageBox(NULL,"Ошибка записи в файл!!!","Сообщение",MB_OK);

- else MessageBox(NULL,"Запись произведена успешно!!!","Сообщение",MB_OK);

CloseHandle(hFile);

}

26

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

1.4. Вспомогательные функции. Связь всех видов функций

Помимо управляющих и информационных функций существуют также вспомогательные. К ним относятся все те функции, которые не влекут за собой конкретные действия, непосредственно связанные с достижением цели, а лишь обслуживают информационные и управляющие функции в процессе их реализации. Так, например, CloseHandle и FindClose обслуживают функции CreatеFile, FindFistFile и FindNextFile, закрывая управляющий дескриптор данных функций. В свою очередь CreatеFile является обслуживающей для функций WriteFile и ReadFile. А FindFistFile предоставляет услуги для FindNextFile.

Кроме того, что связаны между собой вспомогательные и невспомогательные функции, очевидна также связь между информационными и вспомогательными функциями, в смысле их совместного использования. Так, например, использованию той или иной управляющей функции должна предшествовать функция получения информации, а после выполнения управляющей функции бывает необходимо проверить результаты выполнения.

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

27

2.УСТРОЙСТВА РУЧНОГО ВВОДА

2.1.Назначение устройств ручного ввода и их виды

Основными устройствами ручного ввода в графических интерфейсах пользователя современных ПЭВМ являются клавиатура и мышь. С помощью данных устройств оператор осуществляет ввод команд с целью управления программой, выполняемой на ПЭВМ. Кроме того, при помощи клавиатуры оператор вводит данные, а с помощью мыши выбирает данные из предлагаемого списка, т.е. клавиатура и мышь являются источниками данных и команд управления для выполняемой программы.

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

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

Среди новых устройств ручного ввода двухкнопочная мышь заняла ведущую позицию. Такое лидерство объясняется появлением и развитием операционных систем семейства Windows со своим интерфейсом Win32. Управление в подобных системах может полностью осуществляться мышью, за исключением ввода символов для идентификации, снятия защиты от несанкционированного доступа и т.д.

28

В настоящее время изготовители компьютерного оборудования предлагают большой выбор мышей разного типа. Мыши отличаются не только внешним видом, но и способом подключения.

На данном этапе развития ПЭВМ интерфейс пользователя имеет диалоговый характер, где основными устройствами ввода являются клавиатура и мышь. Поэтому управление мышью и клавиатурой является приоритетной задачей.

2.2. Функции Win32 API для клавиатуры и мыши

Большинство функций Win32 API, связанных с устройствами ручного ввода, осуществляют проверку поступающей информации, являясь, таким образом, информационными. К основным информационным функциям устройств ручного ввода можно отнести следующие ниже перечисленные функции.

Для клавиатуры:

GetKeyboardType;

GetKeyboardState;

GetKeyState;

GetAsyncKeyState.

GetKeyboardType возвращает информацию о текущей клавиатуре. С помощью данной функции можно запросить: тип, подтип клавиатуры и количество функциональных клавиш. На входе функции необходимо указать тип запрашиваемой информации:

0 - тип клавиатуры;

1 - подтип клавиатуры;

2 - количество функциональных клавиш.

Подтип - это (ОЕМ) - зависимое значение. Если функция запрашивает тип клавиатуры, то на выходе возможны следующие варианты:

1 - IBM® PC/XTд or compatible (83-key) keyboard 29

2 - Olivetti® "ICO" (102-key) keyboard

3 - IBM AT® (84-key) or similar keyboard

4 - IBM enhanced (101or 102-key) keyboard 5 - Nokia® 1050 and similar keyboards

6 - Nokia 9140 and similar keyboards

7 - Japanese keyboard

При ошибке функция возвращает нуль.

Синтаксис: int GetKeyboardType(fnKeybInfo)

int fnKeybInfo; // тип запрашиваемой информации

GetKeyboardState позволяет получить массив значений, отражающих текущее состояние клавиатуры. Массив размером 256 байт соответствует состоянию каждой из 256 клавиш виртуальной таблицы. Если старший бит установлен, то клавиша нажата. Если младший бит виртуальных клавиш

"NumLock", "CapsLock" или "ScrollLock" установлен, то данные клавиши задействованы, о чем свидетельствует соответствующая индикация. Код виртуальных клавиш '0' - '9' и 'A' - 'Z' соответствует их ASCIIкоду. Для остальных клавиш определены константы: "VK_F1" - "VK_F24", "VK_NUMPAD0" - "VK_NUMPAD9", "VK_NUMLOCK", "VK_SCROLL", "VK_LBUTTON" - "VK_RBUTTON"(для мыши), "VK_SHIFT", "VK_CONTROL", "VK_MENU"(Alt) и

т.д. Функция возвращает true при корректном ее завершении.

Синтаксис: BOOL GetKeyboardState(pbKeyState)

PBYTE pbKeyState; // указатель на массив, принимающий состояние клавиатуры

Действие GetKeyState сходно с действием GetKeyboardState, но только для одной клавиши. Если старший бит младшего байта установлен, то клавиша нажата. Если младший бит виртуальных клавиш "NumLock", "CapsLock" или "ScrollLock" установлен, то данные клавиши задействованы.

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]