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);