記憶體對映檔案,是由乙個檔案到一塊記憶體的對映。與虛擬記憶體有些類似,通過記憶體對映檔案可以保留乙個位址空間的區域,同時將物理儲存器提交給此區域,記憶體檔案對映的物理儲存器來自乙個已經存在的磁碟上的檔案,而且在對該檔案進行操作之前必須首先對檔案進行對映。
另外,記憶體對映檔案是由乙個檔案到程序位址空間的對映,win32中,每個程序有自己的位址空間,乙個程序不能輕易地訪問另乙個程序位址空間的資料,記憶體對映檔案允許多個程序共享資料。
下面給出使用記憶體對映檔案的一般方法:
(1)建立檔案物件
首先要通過createfile()函式來建立或開啟乙個檔案核心物件,這個物件標識了磁碟上將要用作記憶體對映檔案的檔案。在用createfile()將檔案映像在物理儲存器的位置通告給作業系統後,只指定了映像檔案的路徑,映像的長度還沒有指定。
(2)建立檔案對映物件
(3)將檔案資料對映到程序的位址空間
由mapviewoffile()函式負責通過系統的管理而將檔案對映物件的全部或部分對映到程序位址空間。
(4)清除和使用過資源的釋放
通過unmapviewoffile()完成從程序的位址空間撤消檔案資料的映像、通過closehandle()關閉前面建立的檔案對映物件和檔案物件。
#include #include #include #include using namespace std;void* g_pszmapview;
dword dwfilesize=getfilesize(hfile,null);/*獲取檔案大小*/
size_t view_size=1024*256;
/*建立檔案記憶體對映物件。*/
hfile, /*需要對映的檔案物件控制代碼*/
null, /*記憶體對映檔案的安全屬性*/
page_readwrite, /*對對映檔案的保護型別,page_readonly:唯讀;page_readwrite:可讀寫*/
0, /*這兩個引數共同指定記憶體對映檔案的長度,若函式建立共享記憶體,則需要為這兩個引數指定值*/
view_size, /*否則,均設定為0,表示記憶體對映檔案長度與已經存在的檔案長度一樣*/
null); /*記憶體對映檔名*/
if(hmapfile==invalid_handle_value)
/* 把檔案資料對映到程序的位址空間*/
g_pszmapview=mapviewoffile(
hmapfile, /*記憶體對映檔案的物件控制代碼*/
file_map_all_access, /*指定保護型別*/
0, /*從檔案的指定位址開始對映*/
0, /*指定對映停止的檔案指標位址*/
0); /*需要對映的位元組數,若為0則對映整個檔案*/
if (!g_pszmapview)
//結束
//unmapviewoffile(g_pszmapview); //撤銷對映
//closehandle(hfile); //關閉檔案
/*至此,就獲得了外部檔案pszpathname在記憶體位址空間的對映,*/
return true;
}int main()
{
char cwrite="3ting";
const int nlen=sizeof(cwrite);
char* temp=(char*)g_pszmapview;
strcat(temp,cwrite);
char cread[nlen];
//讀資料
memcpy(cread,g_pszmapview,nlen-1);
cout<
記憶體對映檔案機制處理大檔案
原文 hongchangfirst hongchangfirst的主頁 先說結論 使用記憶體對映檔案來處理大檔案可以提高效率。為什麼呢?我們先來看看如果不使用記憶體對映檔案的處理流程是怎樣的,首先我們得先讀出磁碟檔案的內容到記憶體中,然後修改,最後回寫到磁碟上。第一步讀磁碟檔案是要經過一次系統呼叫的...
VC中用記憶體對映檔案處理大檔案
引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數 場合的要求,但是對於某些特殊應用領域所需要...
VC中用記憶體對映檔案處理大檔案
檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數場合的要求,但是對於某些特殊應用領域所需要的動輒幾...