前面我們講過記憶體對映檔案的使用,但是,如果檔案大小超過記憶體大小那怎麼辦呢
其實,我們在把記憶體對映檔案對映到程序的位址空間時,可以對映一部分,通過乙個迴圈,把整個檔案處理完
下面我舉個例子
#include
#include
#include
using
namespace
std;
__int64 count0s();
int main()
__int64 count0s()
//建立檔案對映物件
if(hfilemap==null)
//獲取檔案大小
dword filesizehigh,filesizelow;
filesizelow=getfilesize(hfile,&filesizehigh);
//在這裡如果想要獲取超過4gb檔案的大小
__int64 filesize=filesizelow+(filesizehigh<<32);
closehandle(hfile);
__int64 fileoffset=0,numof0s=0;
dword dwbytesinblock;
while(filesize>0)
}unmapviewoffile(pbfile);
fileoffset+=dwbytesinblock;
filesize-=dwbytesinblock;
}closehandle(hfilemap);
return numof0s;
}
這裡需要注意的是檔案的位移一定需要是分配粒度的倍數,所以,當所剩的大小大於分配粒度時 dwbytesinblock等於分配粒度,否則等於檔案剩下的大小
測試結果:
4796
大檔案處理 記憶體檔案對映
記憶體對映檔案,是由乙個檔案到一塊記憶體的對映。與虛擬記憶體有些類似,通過記憶體對映檔案可以保留乙個位址空間的區域,同時將物理儲存器提交給此區域,記憶體檔案對映的物理儲存器來自乙個已經存在的磁碟上的檔案,而且在對該檔案進行操作之前必須首先對檔案進行對映。另外,記憶體對映檔案是由乙個檔案到程序位址空間...
記憶體對映檔案機制處理大檔案
原文 hongchangfirst hongchangfirst的主頁 先說結論 使用記憶體對映檔案來處理大檔案可以提高效率。為什麼呢?我們先來看看如果不使用記憶體對映檔案的處理流程是怎樣的,首先我們得先讀出磁碟檔案的內容到記憶體中,然後修改,最後回寫到磁碟上。第一步讀磁碟檔案是要經過一次系統呼叫的...
VC 中使用記憶體對映檔案處理大檔案
vc 中使用記憶體對映檔案處理大檔案 摘要 本文給出了一種方便實用的解決大檔案的讀取 儲存等處理的方法,並結合相關程式 對具體的實現過程進行了介紹。引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile ...