舉例:像操作字符串一樣地操作一個文件中的內容
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);
?//創建內存映射對象,內存映射文件的大小 = 文件長度 + (WCHAR)'\0'
?//因為我們要在文件的末尾加上一個字符串的結束符'\0', 當我們將這個文件映射到內存中時,我們就可以像操作字符串一樣地來操作文件了
?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';
?
?//現在對文件的操作就變成了對一字符串pFile的操作了,所有的字符串函數都能
?//對pFile這個字符串進行操作, 而操作的結果則會被保存到文件中去(但是并不
是改變pFile
?//中的內容后會立刻寫到文件中去,但是在調用UnmapViewOfFile()后,保證先前對pFile的修改全部保存到文件中了)
?//...........
?//statement();
?//............
?UnmapViewOfFile(pFile);
?CloseHandle(hFileMap);
?//我們改變了文件的長度,因此要重新設置文件的結束符以刪除留在文件尾部的多余內容(比如刪除我們先前加到文件末尾的'\0'字符)
?SetFilePointer(hFile,dwLength , NULL, FILE_BEGIN);
?SetEndOfFile(hFile);??//設定當前文件指針所在處為文件結束處.該處后面的內容將被刪除
?CloseHandle(hFile);
?return true;
}