内存映射文件
內存映射文件 (windows許多方法用此來在進程間傳送數據)
1.CreateFile
2.CreateFileMapping?//對含有SEC_LARGE_PAGES標志時用戶必須具有啟用內存鎖定頁面用戶權限,否則會失敗
3.MapViewOfFile
4. //FlushViewOfFile?//確保所做的修改已經被寫入到磁盤中,如果最初是FILE_MAP_COPY,將修改頁交換文件中的文件數據副本,如果是這樣的話ummapviewoffile后數據丟失。可以再做個PAGE_READWRITE視圖,再MoveMemory從前一視圖拷到這個視圖。
5.UnmapViewOfFile
6.CloseHandle(hMap);CloseHandle(hFile); //先后順序無關,MapViewOfFile副作用是增加hFile引用計數。
對多個進程共享同一個文件映射對象來說,所有進程使用的文件映射對象的名稱必須完全相同。
CreateFileMapping傳入INVALID_HANDLE_VALUE時映射頁交換文件,不再映射磁盤文件。
#include <Windows.h> #include <string> #include <iostream> using namespace std;bool FileReverse(const wchar_t* pcFileName) {BOOL bIsUnicode = false;HANDLE hFile = CreateFileW(pcFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if( hFile == INVALID_HANDLE_VALUE ) //here must check, because createfilemapping can accept INVALID_HANDLE_VALUE, and different map view {cout<<"CreateFileW fail"<<endl;return false;}DWORD dwFileSize = GetFileSize(hFile,NULL);HANDLE hMap = CreateFileMappingW(hFile,NULL,PAGE_READWRITE,0,dwFileSize*sizeof(wchar_t),NULL);if( hMap == NULL ){cout<<"CreateFileMappingW fail"<<endl;CloseHandle(hFile);return false;}PVOID pvFile = MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);if( pvFile == NULL ){cout<<"MapViewOfFile fail"<<endl;CloseHandle(hMap);CloseHandle(hFile);return false;}int iUnicodeTestFlag = -1;bIsUnicode = IsTextUnicode(pvFile,dwFileSize,&iUnicodeTestFlag);if(!bIsUnicode){char *pchar = (char*)pvFile;pchar[dwFileSize/sizeof(char)] = '\0';_strrev(pchar);pchar = strstr(pchar,"\n\r"); //find first \r\nwhile( pchar != NULL ){*pchar++ = '\r';*pchar++ = '\n';pchar = strstr(pchar,"\n\r");}}else{wchar_t *pwchar = (wchar_t*)pvFile;pwchar[dwFileSize/sizeof(wchar_t)] = L'\0';if((iUnicodeTestFlag & IS_TEXT_UNICODE_SIGNATURE) != 0){pwchar++;}_wcsrev(pwchar);pwchar = wcsstr(pwchar,L"\n\r"); //find first \r\nwhile( pwchar != NULL ){*pwchar++ = L'\r';*pwchar++ = L'\n';pwchar = wcsstr(pwchar,L"\n\r");}}UnmapViewOfFile(pvFile);CloseHandle(hMap);//delete manuly append '\0'SetFilePointer(hFile,dwFileSize,NULL,FILE_BEGIN);SetEndOfFile(hFile);CloseHandle(hFile);return true; }void wmain() {FileReverse(L"testu.txt"); }
?
總結
- 上一篇: 内存体系 用共享段于进程间联系
- 下一篇: 堆的使用