當我們對檔案進行讀寫操作的時候,我們經常會呼叫readfile和writefile這兩個api,但是如果我們的檔案較大,幾百兆甚至幾g且需要時常修改值b的時候,這時那兩個函式可能就不大好了,這時微軟提供了另外一種方法--檔案對映,來使我們進行檔案操作。
handle hfile, // 檔案控制代碼
lpsecurity_attributes lpattributes, // 安全屬性,一般為null
dword flprotect, // 保護屬性
dword dwmaximumsizehigh, // 記憶體對映檔案的大小,高32位
dword dwmaximumsizelow, // 記憶體對映檔案的大小,低32位
lpctstr lpname // 指定對映物件的名稱,一般不需要,給null就行);
第二個api是mapviewoffile,宣告如下:
lpvoid mapviewoffile(
dword dwdesiredaccess, // 訪問的模式
dword dwfileoffsethigh, // 檔案的偏移量,高32位
dword dwfileoffsetlow, // 檔案的偏移量,低32位
size_t dwnumberofbytestomap // 對映的位元組數
);
第三個是flushviewoffile,宣告如下:
bool flushviewoffile(
size_t dwnumberofbytestoflush // 要重新整理的位元組數
);
第四個是unmapviewoffile,宣告如下:
bool unmapviewoffile(
lpcvoid lpbaseaddress // 開始的位址,由mapviewoffile返回值一樣
);
附上以上**的例子:
#include int _tmain(int argc, _tchar* argv)
//獲取檔案的大小
dword dwsize = getfilesize(hfile, 0);
//建立檔案對映物件
//對映到具體的記憶體
lpbyte pbuf = (lpbyte)mapviewoffile(hmap, file_map_all_access, 0, 0, 10); //雖然這裡只對映10個位元組,但是系統卻並不只是對映10個位元組,系統會做乙個跟硬碟的乙個扇區大小做對齊,一般來說,乙個扇區為512個位元組,若不夠乙個扇區,則預設對映乙個扇區,總之,對映的大小為扇區大小的整數倍
//將第三個位元組和第四個位元組改為1和2
pbuf[3] = 0x31;
pbuf[4] = 0x32;
//將更新的內容重新整理到檔案中
flushviewoffile(pbuf, dwsize);
//釋放記憶體區域
unmapviewoffile(pbuf);
closehandle(hmap);
closehandle(hfile);
return 0;
}
Windows核心程式設計 記憶體對映檔案(2)
2.對映到記憶體的資料檔案 這種方法最大的優點是讓系統為我們處理所有與檔案快取有關的操作,我們不必關心分配記憶體 把檔案中的資料載入記憶體,把資料 寫回檔案 以及釋放記憶體等操作,不過如果 操作過程被打斷,比如斷電,資料可能被破壞。要使用記憶體對映檔案,需執行以下步驟 1 建立或開啟乙個檔案核心物件...
Windows核心程式設計 記憶體對映檔案(3)
1.用記憶體對映檔案來處理大檔案 方法就是只對映檔案的乙個檢視,這個檢視只包含檔案的一小部分資料。比如一開始時,把檔案開關的部分對映到檢視中,完成對檢視的訪問後,撤銷這一部分的對映,再把檔案的另一部分對映到檢視,重複此過程,直至完成對整個檔案的訪問。2.記憶體對映檔案和一致性 系統允許把同乙個檔案中...
程式設計之最大對映
有 n 個字串,每個字串都是由 a j 的大寫字元構成。現在你將每個字元對映為乙個 0 9 的數字,不同字元對映為不同的數字。這樣每個字串就可以看做乙個整數,唯一的要求是這些整數必須是正整數且它們的字串不能有前導零。現在問你怎樣對映字元才能使得這些字串表示的整數之和最大?輸入描述 每組測試用例僅包含...