VC 中使用記憶體對映檔案處理大檔案

2022-05-09 13:39:08 字數 1432 閱讀 7708

引言

檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile()、writefile()、readfile()和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數場合的要求,但是對於某些特殊應用領域所需要的動輒幾十gb、幾百gb、乃至幾tb的海量儲存,再以通常的檔案處理方法進行處理顯然是行不通的。目前,對於上述這種大檔案的操作一般是以記憶體對映檔案的方式來加以處理的,本文下面將針對這種windows核心程式設計技術展開討論。

記憶體對映檔案

在使用記憶體對映檔案時,所使用的api函式主要就是前面提到過的那幾個函式,下面分別對其進行介紹:

handle createfile(lpctstr lpfilename,

dword dwdesiredaccess,

dword dwsharemode,

lpsecurity_attributes lpsecurityattributes,

dword dwcreationdisposition,

dword dwflagsandattributes,

handle htemplatefile);

引數dwnumberofbytestomap指定了資料檔案的對映長度,這裡需要特別指出的是,對於windows 9x作業系統,如果mapviewoffile()無法找到足夠大的區域來存放整個檔案對映物件,將返回空值(null);但是在windows 2000下,mapviewoffile()只需要為必要的檢視找到足夠大的乙個區域即可,而無須考慮整個檔案對映物件的大小。

在完成對對映到程序位址空間區域的檔案處理後,需要通過函式unmapviewoffile()完成對檔案資料映像的釋放,該函式原型宣告如下:

bool unmapviewoffile(lpcvoid lpbaseaddress);

使用記憶體對映檔案處理大檔案應用示例

下面結合乙個具體的例項來進一步講述記憶體對映檔案的使用方法。該例項從埠接收資料,並實時將其存放於磁碟,由於資料量大(幾十gb),在此選用記憶體對映檔案進行處理。下面給出的是位於工作執行緒mainproc中的部分主要**,該執行緒自程式執行時啟動,當埠有資料到達時將會發出事件hevent[0],waitformultipleobjects()函式等待到該事件發生後將接收到的資料儲存到磁碟,如果終止接收將發出事件hevent[1],事件處理過程將負責完成資源的釋放和檔案的關閉等工作。下面給出此執行緒處理函式的具體實現過程:

結論

經實際測試,記憶體對映檔案在處理大資料量檔案時表現出了良好的效能,比通常使用cfile類和readfile()和writefile()等函式的檔案處理方式具有明顯的優勢。本文所述**在windows 98下由microsoft visual c++ 6.0編譯通過。

VC 中使用記憶體對映檔案處理大檔案

vc 中使用記憶體對映檔案處理大檔案 摘要 本文給出了一種方便實用的解決大檔案的讀取 儲存等處理的方法,並結合相關程式 對具體的實現過程進行了介紹。引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile ...

VC 中使用記憶體對映檔案處理大檔案

檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數場合的要求,但是對於某些特殊應用領域所需要的動輒幾...

VC 中使用記憶體對映檔案處理大檔案

先貼 include stdafx.h include windows.h include iostream using namespace std string getvalue const char lpbmapaddress,const char sname intmain 得到檔案尺寸 dw...