win32下使用內(nèi)存映射文件

字號(hào):

映射文件把虛擬可尋址空間映射到文件上。整個(gè)文件就可以很容易的訪問,就像它在內(nèi)存中一樣。但是它實(shí)質(zhì)還是在硬盤中,只是需要的時(shí)候載入需要的部分到內(nèi)存,這樣可以節(jié)約物理內(nèi)存的使用。windows 使用 這個(gè)來加載EXE和DLL,所以這個(gè)因該是高效的。windows下默認(rèn)的虛擬內(nèi)存頁最小是512KB,所以對(duì)512KB以下的文件使用就是多余的低效的。
    按照以下步驟使用
    1. 調(diào)用CreateFile打開您想要映射的文件。
    2. 調(diào)用CreateFileMapping,其中要求傳入先前CreateFile返回的句柄,該函數(shù)生成一個(gè)建立在CreateFile函數(shù)創(chuàng)建的文件對(duì)象基礎(chǔ)上的內(nèi)存映射對(duì)象。
    3. 調(diào)用MapViewOfFile函數(shù)映射整個(gè)文件的一個(gè)區(qū)域或者整個(gè)文件到內(nèi)存。該函數(shù)返回指向映射到內(nèi)存的第一個(gè)字節(jié)的指針。
    4. 用該指針來讀寫文件。
    5. 調(diào)用UnmapViewOfFile來解除文件映射。
    6. 調(diào)用CloseHandle來關(guān)閉內(nèi)存映射文件。注意必須傳入內(nèi)存映射文件的句柄。
    7. 調(diào)用CloseHandle來關(guān)閉文件。注意必須傳入由CreateFile創(chuàng)建的文件的句柄。
    /////////////////////////////////////////////
    //為了簡單 省略錯(cuò)誤檢查
    //建一個(gè)test.txt的文本文件做實(shí)驗(yàn)
    //這里只演示讀取操作
    //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);
     //--------------------------------------
     //從文件創(chuàng)建映射對(duì)象
     HANDLE fileMapping = CreateFileMapping(
     fileHandle,
     NULL,
     PAGE_READONLY,
     0,
     0,
     NULL);
     //---------------------------------------
     //把文件映射到指針(為什么用char,因?yàn)檫@個(gè)大小是一個(gè)Byte)
     char *fileBase = (char *) MapViewOfFile(
     fileMapping,
     FILE_MAP_READ,
     0,
     0,
     0);
     //---------------------------------------
     //使用數(shù)據(jù)
     MessageBox(NULL,fileBase,"MTest",MB_OK);//這句可能有溢出,正常情況誤用。
     UnmapViewOfFile(fileBase);//解除文件映射
     CloseHandle(fileMapping);//關(guān)閉內(nèi)存映射文件
     CloseHandle(fileHandle);//關(guān)閉文件
     return 0;
    }