FAQ:WinAPI VCPP:проекция файла в память

Материал из Весельчак У
Версия от 15:59, 3 октября 2009; RXL (обсуждение | вклад) (Новая: ===Как открыть проекцию файла в память и как с ней работать?=== Создание проекции: <code cpp> HANDLE CreateFileMapping( H...)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Как открыть проекцию файла в память и как с ней работать?

Создание проекции:

HANDLE CreateFileMapping(
	HANDLE hFile, // хендл уже открытого файла
	LPSECURITY_ATTRIBUTES lpAttributes,
	DWORD flProtect, // способ открытия проекции
	DWORD dwMaximumSizeHigh, // размер файла (старшие 4 байта, обычно - 0)
	DWORD dwMaximumSizeLow, // размер файла (младшие 4 байта)
	LPCTSTR lpName
);

Доступ к созданной проекции производится процедурой:

LPVOID MapViewOfFile(
	HANDLE hFileMappingObject, // хендл проекции
	DWORD dwDesiredAccess, // способ работы с проекцией
	DWORD dwFileOffsetHigh,
	DWORD dwFileOffsetLow, // смещение от начала файла (младшие 4 байта)
	SIZE_T dwNumberOfBytesToMap // длина в байтах (если 0 - то весь файл)
);

Далее с файлом можно работать как с обычным массивом в памяти.

После работы с проекцией, её надо освободить.

BOOL UnmapViewOfFile(
	LPCVOID lpBaseAddress // адрес, который вернула процедура MapViewOfFile
);

Пример:

HANDLE hFile = ...; // хендл уже открытого файла
DWORD dwdFileLen = ...; // размер открытого файла
HANDLE hMapFile = 0; // хендл для проекции
 
// создаём проекцию "только для чтения"
hMapFile = ::CreateFileMapping(hFile, 0, PAGE_READONLY, 0, dwdFileLen, 0);
 
// хендл hFile можно закрыть уже здесь, в принципе,
// но мы сделаем это позже
 
// получаем доступ к проекции (тоже только для чтения)
BYTE* pbyFile = (BYTE*)::MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
 
///////////////////
// тут работаем с массивом pbyFile[dwdFileLen] как с обычным,
// только не забываем, что он открыт только для чтения
// ...
// ...
// ...
///////////////////
 
// отключаем файл данных от адресного пространства
UnmapViewOfFile(pbyFile);
 
// освобождаем хендл проекции
CloseHandle(hMapFile)
 
// освобождаем хендл открытого файла
CloseHandle(hFile);