Delphi за професионалисти

Използване на файлове за показване

Последният е най-нетрадиционният вид работа с файлове - това са така наречените mapped файлове.

Най-общо казано, в 32-битов Windows „памет“ се отнася не само до паметта с произволен достъп (RAM), но и до паметта, запазена от операционната система на твърдия диск. Този вид памет се нарича виртуална памет. Кодът и данните се нанасят върху твърдия диск посредством пейджинг система. Системата за пейджинг използва файл на страница за показване (win386.swp на Windows 95/98 и pagefile.sys на Windows NT). Необходимата част от виртуалната памет се прехвърля от файла на страницата в RAM и по този начин става достъпна.

Едно или повече приложения могат да отворят показания файл и по този начин да получат достъп до данните на този обект. По този начин данните, поставени във файл на страница от приложение, използващо картографиран файл, могат да бъдат достъпни от други приложения, ако са отворили и използват същия картографиран файл.

Обектите за съпоставяне на файлове се създават и използват чрез функции на Windows API. Има три от тези функции:

функция CreateFiieMapping(hFile: THandle; IpFileMappingAttributes: PSecurityAttributes; flProtect, dwMaximumSizeHigh, dwMaximumSizeLow:

DWORD; IP име: PChar): THandle;

Първият параметър е от тип THandle. Трябва да съответства на манипулатора на файл, който вече е отворен с помощта на функцията createFile. Ако стойността на параметъра hFile е SFFFFFFFF, това води до свързване на обекта за съпоставяне на файл с файла на страницата на операционната система.

Вторият параметър е указател към запис от тип TSecurityAttributes. Ако в Windows NT няма изисквания за защита на данните, тази настройка винаги е зададена нанула. Третият параметър е от тип DWORD. Той определя защитния атрибут. Ако планирате да споделяте данни с помощта на изобразения файл, трябва да зададете третия параметър на PAGE_READWRITE.

Четвъртият и петият параметър също са от тип DWORD. Когато функцията CreateFiieMapping се изпълни, DWORD стойността на четвъртия параметър се измества наляво с четири байта и след това се свързва със стойността на петия параметър с помощта на операцията and. Казано по-просто, стойностите са свързани в едно 64-битово число, равно на количеството памет, разпределено за обекта за картографиране на файлове от файла на страницата на операционната система. Тъй като е малко вероятно да се опитате да разпределите повече от 4 GB данни, стойността на четвъртия параметър винаги трябва да бъде нула. След това петият параметър трябва да показва колко памет в байтове да се резервира като споделена. Ако искате да покажете целия файл, четвъртият и петият параметър трябва да са нула.

Шестият параметър е от тип PChar и е името на обекта за картографиране на файла.

Функцията CreateFileMapping връща стойност от тип THandle. Ако е успешна, върнатата стойност на функцията е манипулатор на създадения обект за картографиране на файл. Ако възникне грешка, върнатата стойност ще бъде 0.

функция MapViewOfFile(hFileMappingObject: THandle; dwDesiredAccess:

DWORD; dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap: DWORD):

Първият параметър е от тип THandle. Стойността му трябва да бъде манипулатор на генерирания обект за съпоставяне на файл, този, върнат от функцията createFileMapping. Вторият параметър определя режима на достъп до файла: FILE_MAP_WRITE, FILE_MAP_READ илиFILE_MAP_ALL_ACCESS.

Третият и четвъртият параметър също са от тип DWORD. Това е отместването на показаната област спрямо началото на файла в байтове. В нашия случай тези параметри трябва да бъдат зададени на нула, тъй като стойността, която даваме на петия (последен) параметър на функцията MapViewOfFile, също е нула.

Петият (и последен) параметър на функцията MapViewOfFile, подобно на предишните параметри, е от тип DWORD. Използва се за определяне (в байтове) на количеството данни за обект на файлова карта, които да бъдат съпоставени към процеса (направени достъпни за вас). За да постигнем нашите цели, тази стойност трябва да бъде зададена на нула, което означава, че процесът автоматично показва всички данни, разпределени преди тази функция.

Стойността, върната от функцията MapViewOfFile, е от тип указател.

Следният кодов фрагмент демонстрира извикването на функцията MapViewOfFile:

hMappedFile: THandle; pSharedBuf: PChar;

CreateFiieMapping(FHandle, nil, PAGE_READWRITE, 0, 0, 'SharedBlock');

MapViewOfFiie(hMappedFile, FILE_MAP_ALL_ACCESS, 0, 0, 0) ;

if (pSharedBuf = nil) тогава

ShowMessage('MapView грешка');

Функцията UnMapViewOfFile трябва да бъде извикана преди функцията CloseHandle.

Функцията UnMapViewOfFile предава един параметър на указател:

процедура TClientForm.FormDestroy(Подател: TObject);

Показаните файлове вече ще бъдат използвани в други глави на тази книга. Не се изненадвайте, защото това е много мощен инструмент: в допълнение към възможността за споделяне, той ви позволява значително да ускорите достъпа до файлове, особено големи.