win32下使用内存映射文件
3445 点击·0 回帖
![]() | ![]() | |
![]() | 映射文件把虚拟可寻址空间映射到文件上。整个文件就可以很容易的访问,就像它在内存中一样。但是它实质还是在硬盘中,只是需要的时候载入需要的部分到内存,这样可以节约物理内存的使用。windows 使用 这个来加载EXE和DLL,所以这个因该是高效的。windows下默认的虚拟内存页最小是512KB,所以对512KB以下的文件使用就是多余的低效的。 按照以下步骤使用 1. 调用CreateFile打开您想要映射的文件。 2. 调用CreateFileMapping,其中要求传入先前CreateFile返回的句柄,该函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象。 3. 调用MapViewOfFile函数映射整个文件的一个区域或者整个文件到内存。该函数返回指向映射到内存的第一个字节的指针。 4. 用该指针来读写文件。 5. 调用UnmapViewOfFile来解除文件映射。 6. 调用CloseHandle来关闭内存映射文件。注意必须传入内存映射文件的句柄。 7. 调用CloseHandle来关闭文件。注意必须传入由CreateFile创建的文件的句柄。 ///////////////////////////////////////////// //为了简单 省略错误检查 //建一个test.txt的文本文件做实验 //这里只演示读取操作 //win32 console 程序 //winXP+vc6 //write by DKink|棼紫 //2007.10.09 #include "stdafx.h" #include #include int main(int argc, char* argv[]) { TCHAR *fileName =_T("test.txt"); //-------------------------------------- //打开文件 HANDLE fileHandle = CreateFile( fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,//文件必须存在 0, NULL); //-------------------------------------- //从文件创建映射对象 HANDLE fileMapping = CreateFileMapping( fileHandle, NULL, PAGE_READONLY, 0, 0, NULL); //--------------------------------------- //把文件映射到指针(为什么用char,因为这个大小是一个Byte) char *fileBase = (char *) MapViewOfFile( fileMapping, FILE_MAP_READ, 0, 0, 0); //--------------------------------------- //使用数据 MessageBox(NULL,fileBase,"MTest",MB_OK);//这句可能有溢出,正常情况误用。 UnmapViewOfFile(fileBase);//解除文件映射 CloseHandle(fileMapping);//关闭内存映射文件 CloseHandle(fileHandle);//关闭文件 return 0; } | |
![]() | ![]() |