Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

С файлами




Иногда требуются стандартные функции работы с файлами Windows, тем более что возможности в них расширены. Каждый файл в Windows опи­сывается не переменной, а дескриптором (THandle, можно описывать Car­dinal), который представляет собой 32-разрядную величину, идентифици­рующую файл в операционной системе. Открывается файл при помощи сле­дующей функции:

 

function CreateFileA(lpFileName: PAnsiChar;

dwDesiredAccess, dwShareMode: DWORD;

lpSecurityAttributes: PSecurityAttributes;

dwCreationDisposition, dwFlagsAndAttributes: DWORD;

hTemplatePile: THandle): THandle; stdcall;.

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

Здесь ipFileName - имя открываемого объекта; dwDesiredAccess -способ доступа к объекту (может иметь значение generic_read-для чте­ния, generic_write - для записи или комбинация этих значений). Если dwDesiredAccess =0, то можно получить атрибуты файла без фактическо­го его открытия. Параметр dwShareMode открывает режим совместного с другими программами доступа (о - совместный доступ запрещен;

FILE_SHARE_READ – для чтения; FILE_SHARE_WRITE – Для записи; Комбинация этих значений - полный доступ). В рассматриваемой функции можно задавать атрибуты защиты объекта - lpSecurityAttributes (если равно nil, то устанавливаются атрибуты по умолчанию). Следующий параметр dwCreationDisposition отвечает за способ открытия объекта (create_new - создается новый объект, если таковой существует, иначе воз­вращается Ошибка ERROR_ALREADY_EXISTS; CREATE_ALWAYS - создается

новый объект, если таковой существует, или, если возможно, перезаписыва-202


ется, иначе выдается ошибка; open_exi sting - открывает существующий объект или, если таковой не найден, возвращается ошибка; open_always -открывает существующий объект, если таковой не найден, он создается). Набор атрибутов (скрытый, системный, сжатый) и флагов для открытия объ­екта задается параметром dwFlagsAndAttributes. Последний параметр hTemplateFile задает файл-шаблон, атрибуты которого используются для открытия объекта.

Функция возвращает дескриптор открытого объекта (некоторое число). Если открыть объект невозможно, то возвращается код ошибки invalid_handle_valoe. Более полные сведения об ошибке можно полу­чить, вызвав функцию GetLastError.

Закрывается объект функцией function CloseHandle(hObject: THandle): BOOL; stdcall;.

Для чтения и записи данных используются следующие функции:

 

function ReadFile(hFile: THandle; var Buffer; nNumberOf-BytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOver-lapped: POverlapped): BOOL; stdcall;

function WriteFile(hFile: THandle; const Buffer; nNum-berOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;

Здесь nNumberOfBytesToRead и nNumberOfBytesToWrite - количест­во байт, которое нужно прочитать или записать; lpNumberOfBytesRead и lpNumberOfBytesWritten - количество байт, которое фактически прочи­тано или записано. Параметр lpOverlapped - указатель на некоторый деск­риптор структуры (типа TOverlapped) события отложенного ввода или вы­вода, например, для каких-то относительно "медленных" устройств. Созда­ется событие следующей функцией: function CreateEventA(lpEven-tAttributes: PSecurityAttributes; bManualReset, blnitialState:BOOL; lpName: PAnsiChar): THandle; stdcall;. Эта функция как раз и возвращает указанный выше дескриптор, на который ссылается параметр lpOverlapped. С помощью данного события автоматически включается отложенный ввод или вывод. Время в миллисекундах (параметр dwMilli-seconds), которое разрешается ожидать при отложенном вводе или выводе, указывается в функции function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; stdcall;, которая преры­вает отложенную операцию чтения или записи. Можно задать бесконечный интервал infinite.

Функция createFileA полезна при работе с портами, например, сле­дующая программа позволяет успешно открыть порт СОМ1 и выдать мини­мальные сведения о подключенном к этому порту модеме.

procedure TForm1. Button1Click (Sender: TObject);


var CommPort: string;

hDev: THandle;

ModemStat: DWord;

begin

CommPort:= 'CCM1';

hDev:= CreateFile(PChar(CommPort), GENERIC_READ,O,nil,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hDev = INVALID_HANDLE_VALUE then begin

ShowMessage('Ошибка открытия порта '+ CommPort); exit;

end;

if GetCommModemStatus(hDev,ModemStat)ofalse then begin

if ModemStat and MS_CTS_ON <> 0 then ShowMessage(

'Управление CTS (clear-to-send) в порядке.');

if ModemStat and MS_DSR_ON <>0 then ShowMessage(

'Управление DSR (data-set-ready) в порядке.'); if ModemStat and MS_RIN6_ON <> Othen ShowMessage(

'Управление ring indicator в порядке.');

if ModemStat and MS_RLSD_ON <> 0 then ShowMessage('Управление RLSD (receive-line-signal-detect) в порядке.'); end;

CloseHandle(hDev); end;.

Еще один вариант использования рассматриваемой функции Windows API можно привести, когда требуется посекторное чтение, например, в дис­ководе А:.

Const SectorSize=512; Var Buffer:Pointer;

FUNCTION TForm1.ReadSector(Head,Track,Sector:integer; Buffer:pointer):boolean;

var

hDev:THandle; DevName:string; nb:cardinal;

begin

DevName: ='\\.\A: ';

hDev:=CreateFile(pChar(DevName),GENERIC_READ,

FILE_SHARE_READ or FILE_SHARE_WRITE,nil,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

if hDev=INVALID_HANDLE_VALDE then begin

Result:=false;

Exp­end;

SetFilePointer(hDev,(Sector-1)*SectorSize,nil,FILE_BEGIN); Result:=ReadFile(hDev,Buffer,SectorSize,nb,nil)

and (nb=SectorSize);


CloseHandle(hDev);

end;

В данном примере для позиционирования файлового указателя применя­ется еще одна функция Windows API setFilePointer, объявленная сле­дующим образом: function SetFilePointer(hFile: THandle; lDis-tanceToMove: Longint; lpDistanceToMoveHigh: Pointer; dwMoveMethod: DWORD): DWORD; stdcall;.

Как следует из примера функции ReadSector, позиционирование фай­лового указателя не учитывает значений параметров Head и Track (опущено для упрощения). При необходимости можно добавить взаимосвязь всех трех параметров.

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

ПРИМЕР ПРИЛОЖЕНИЯ 25

Пусть имеется текстовый файл, созданный по правилам Delphi. Требует­ся открыть этот файл указанной выше функцией Windows API и прочитать его содержимое. При выполнении этого примера встретятся некоторые трудности из-за того, что придется читать файл как совокупность байтов, а потом эти байты пытаться интерпретировать. Вариант решения примера приводится на рис. 61.

Рис.61 Ниже приводится текст программы.

unit OMSfile; interface


uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons type

TForm1 = class(TForm) Button1: TButton;

Memo1: TMemo;

BitBtnl: TBitBtn;

Memo2: TMemo;

Label1: TLabel;

procedure Button1Click (Sender: TObject); procedure FormDeactivate (Sender: TObject); public

hDev:THandle; end;

var Form1: TForm1; Buffer:pointer; FilSize:cardinal; implementation

{$R *.dfm}

procedure TForm1.Button1Click (Sender: TObject); type buf=array of byte; var FilName:string; nb:cardinal; i,r:byte; F:File;

sNumber:string [3]; begin

FilName: ='InpFil.txt'; Buffer:= Nil; FilSize:=0;

AssignFile(F, FilName);

System.Reset(F, 1);

{$1+}

if IOResult<>O then begin

memo1.Lines.Add('Ошибка открытия файла');

Exit; End;

FilSize:= FileSize(F); closeFILE(F);

Memo1.Lines.Add('FilSize= '+inttostr(FilSize)); memo2.Lines.LoadFromFile(FilName); hDev:=CreateFileA(pChar(FilName),GENERIC_READ,




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


Дата добавления: 2014-12-29; Просмотров: 368; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.025 сек.