КАТЕГОРИИ: Архитектура-(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, можно описывать Cardinal), который представляет собой 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; Expend; 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; Просмотров: 386; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |