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

字號:

映射文件把虛擬可尋址空間映射到文件上。整個文件就可以很容易的訪問,就像它在內(nèi)存中一樣。但是它實質(zhì)還是在硬盤中,只是需要的時候載入需要的部分到內(nèi)存,這樣可以節(jié)約物理內(nèi)存的使用。windows 使用 這個來加載EXE和DLL,所以這個因該是高效的。windows下默認(rèn)的虛擬內(nèi)存頁最小是512KB,所以對512KB以下的文件使用就是多余的低效的。
    按照以下步驟使用
    1. 調(diào)用CreateFile打開您想要映射的文件。
    2. 調(diào)用CreateFileMapping,其中要求傳入先前CreateFile返回的句柄,該函數(shù)生成一個建立在CreateFile函數(shù)創(chuàng)建的文件對象基礎(chǔ)上的內(nèi)存映射對象。
    3. 調(diào)用MapViewOfFile函數(shù)映射整個文件的一個區(qū)域或者整個文件到內(nèi)存。該函數(shù)返回指向映射到內(nèi)存的第一個字節(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)建的文件的句柄。
    /////////////////////////////////////////////
    //為了簡單 省略錯誤檢查
    //建一個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);
     //--------------------------------------
     //從文件創(chuàng)建映射對象
     HANDLE fileMapping = CreateFileMapping(
     fileHandle,
     NULL,
     PAGE_READONLY,
     0,
     0,
     NULL);
     //---------------------------------------
     //把文件映射到指針(為什么用char,因為這個大小是一個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;
    }