Delphi для професіоналів

Використання файлів, що відображаються

Останній - найнетрадиційніший вид роботи з файлами - це так звані файли, що відображаються.

Взагалі кажучи, у 32-розрядній Windows під "пам'яттю" мається на увазі не тільки оперативна пам'ять (ОЗП), але також і пам'ять, що резервується операційною системою на жорсткому диску. Цей вид пам'яті називається віртуальною пам'яттю. Код та дані відображаються на жорсткий диск за допомогою сторінкової системи (paging system) підкачування. Сторінка використовує для відображення сторінковий файл (win386.swp в Windows 95/98 і pagefile.sys в Windows NT). Необхідний фрагмент віртуальної пам'яті переноситься зі сторінки файлу в ОЗУ і, таким чином, стає доступним.

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

Створення та використання об'єктів файлового відображення здійснюється за допомогою функцій Windows API. Цих функцій три:

function CreateFiieMapping(hFile: THandle; IpFileMappingAttributes: PSecurityAttributes; flProtect, dwMaximumSizeHigh, dwMaximumSizeLow:

DWORD; IpName: PChar): THandle;

Перший параметр має тип THandle. Він повинен відповідати дескриптору вже відкритого за допомогою функції файлу createFile. Якщо значення hFile дорівнює SFFFFFFFF , це призводить до зв'язування об'єкта файлового відображення зі сторінковим файлом операційної системи.

Другий параметр - покажчик на запис типу TSecurityAttributes. За відсутності вимог до захисту даних у Windows NT значення цього параметра завжди дорівнюєnil. Третій параметр має тип DWORD. Він визначає атрибут захисту. Якщо за допомогою файлу, що відображається, ви плануєте спільне використання даних, третьому параметру слід присвоїти значення PAGE_READWRITE .

Четвертий та п'ятий параметри також мають тип DWORD. Коли виконується функція CreateFiieMapping, значення типу DWORD четвертого параметра зсувається вліво на чотири байти і потім об'єднується зі значенням п'ятого параметра за допомогою операції and. Простіше кажучи, значення об'єднуються в одне 64-розрядне число, що дорівнює обсягу пам'яті, що виділяється об'єкту файлового відображення зі сторінкового файлу операційної системи. Оскільки ви навряд чи спробуєте здійснити виділення більш ніж 4 Гбайт даних, то значення четвертого параметра завжди має дорівнювати нулю. Потім п'ятий параметр повинен показувати, скільки пам'яті в байтах необхідно зарезервувати як спільну. Якщо ви хочете відобразити весь файл, четвертий і п'ятий параметри повинні дорівнювати нулю.

Шостий параметр має тип PChar і є ім'я об'єкта файлового відображення.

Функція CreateFileMapping повертає значення типу THandle. У разі успішного завершення значення, що повертається функцією, являє собою дескриптор створеного об'єкта файлового відображення. У разі виникнення будь-якої помилки значення, що повертається, дорівнюватиме 0.

function 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) then

ShowMessage ('MapView error');

Функція UnMapViewOfFile повинна викликатись перед функцією CloseHandle .

Функція UnMapViewOfFile передає єдиний параметр типу покажчик:

procedure TClientForm.FormDestroy(Sender: TObject);

Файли, що відображаються, вже будуть використовуватися і в інших розділах цієї книги. Не варто дивуватися, адже це дуже потужний інструмент: крім можливості спільного доступу, він дозволяє помітно прискорити доступ до файлів, особливо великого розміру.