映射文件把虛擬可尋址空間映射到文件上。整個(gè)文件就可以很容易的訪問,就像它在內(nèi)存中一樣。但是它實(shí)質(zhì)還是在硬盤中,只是需要的時(shí)候載入需要的部分到內(nèi)存,這樣可以節(jié)約物理內(nèi)存的使用。windows 使用 這個(gè)來(lái)加載EXE和DLL,所以這個(gè)因該是高效的。windows下默認(rèn)的虛擬內(nèi)存頁(yè)最小是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. 用該指針來(lái)讀寫文件。
5. 調(diào)用UnmapViewOfFile來(lái)解除文件映射。
6. 調(diào)用CloseHandle來(lái)關(guān)閉內(nèi)存映射文件。注意必須傳入內(nèi)存映射文件的句柄。
7. 調(diào)用CloseHandle來(lái)關(guān)閉文件。注意必須傳入由CreateFile創(chuàng)建的文件的句柄。
/////////////////////////////////////////////
//為了簡(jiǎn)單 省略錯(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;
}
按照以下步驟使用
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. 用該指針來(lái)讀寫文件。
5. 調(diào)用UnmapViewOfFile來(lái)解除文件映射。
6. 調(diào)用CloseHandle來(lái)關(guān)閉內(nèi)存映射文件。注意必須傳入內(nèi)存映射文件的句柄。
7. 調(diào)用CloseHandle來(lái)關(guān)閉文件。注意必須傳入由CreateFile創(chuàng)建的文件的句柄。
/////////////////////////////////////////////
//為了簡(jiǎn)單 省略錯(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;
}