舉例:像操作字符串一樣地操作一個(gè)文件中的內(nèi)容
bool OperateFileJustLikeToString(const char * pszFileName)
{
?const HANDLE hFile = CreateFile(pszFileName, \
??GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, \
??NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
?if(hFile == INVALID_HANDLE_VALUE)
??return false;
?DWORD dwLength = GetFileSize(hFile, NULL);
?//創(chuàng)建內(nèi)存映射對(duì)象,內(nèi)存映射文件的大小 = 文件長度 + (WCHAR)'\0'
?//因?yàn)槲覀円谖募哪┪布由弦粋€(gè)字符串的結(jié)束符'\0', 當(dāng)我們將這個(gè)文件映射到內(nèi)存中時(shí),我們就可以像操作字符串一樣地來操作文件了
?const HANDLE hFileMap = CreateFileMapping(
??hFile, NULL, PAGE_READWRITE, 0,
??dwLength + sizeof(WCHAR),
??NULL);
?
?char * pFile = (char *)MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);
?pFile[dwLength / sizeof(char)] = '\0';
?
?//現(xiàn)在對(duì)文件的操作就變成了對(duì)一字符串pFile的操作了,所有的字符串函數(shù)都能
?//對(duì)pFile這個(gè)字符串進(jìn)行操作, 而操作的結(jié)果則會(huì)被保存到文件中去(但是并不
是改變pFile
?//中的內(nèi)容后會(huì)立刻寫到文件中去,但是在調(diào)用UnmapViewOfFile()后,保證先前對(duì)pFile的修改全部保存到文件中了)
?//...........
?//statement();
?//............
?UnmapViewOfFile(pFile);
?CloseHandle(hFileMap);
?//我們改變了文件的長度,因此要重新設(shè)置文件的結(jié)束符以刪除留在文件尾部的多余內(nèi)容(比如刪除我們先前加到文件末尾的'\0'字符)
?SetFilePointer(hFile,dwLength , NULL, FILE_BEGIN);
?SetEndOfFile(hFile);??//設(shè)定當(dāng)前文件指針?biāo)谔帪槲募Y(jié)束處.該處后面的內(nèi)容將被刪除
?CloseHandle(hFile);
?return true;
}