FAQ:WinAPI VCPP:проекция файла в память
Материал из Весельчак У
Как открыть проекцию файла в память и как с ней работать?
Создание проекции:
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);