RAM内存文件CMemFile的创建修改及使用

tech2022-10-04  92

1.CMemFile的创建

bool CreatCMemFileForA() { CMyJsonObj jsnPass; jsnPass.AddItem(_T("name"), _T("James")); jsnPass.AddItem(_T("age"), _T("18")); jsnPass.AddItem(_T("addr"), _T("China")); CString strJsonBuf = jsnPass.CreateJson();// 将文件内容转为字符串 // 多字节转Unicode再转utf8 int nlen = Ansi2Unicode((LPCTSTR)strJsonBuf, NULL, 0); wchar_t* pBuffer = new wchar_t[nlen]; Ansi2Unicode((LPCTSTR)strJsonBuf, pBuffer, nlen); int nSize = CLib_Global::Unicode2UTF8(pBuffer, NULL, 0); char* szJsonBuf = new char[nSize]; Unicode2UTF8(pBuffer, szJsonBuf, nSize); UINT uLen = (UINT)nSize; CMemFile mf(uLen + 8); char szHeader[4] = { 'A', 'B', 'C', 'D' }; mf.Write(szHeader, 4); mf.Write(&uLen, sizeof(UINT)); mf.Write(szJsonBuf, uLen); DWORD uSize = (DWORD)mf.GetLength(); BYTE* pData = mf.Detach(); PCTSTR szMemFileName = _T("MyFileMap"); HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, uSize, szMemFileName); PBYTE pMapAddr = reinterpret_cast<PBYTE>(::MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 0)); memcpy(pMapAddr, pData, uSize); // 拷贝数据到共享文件里。 FlushViewOfFile(pMapAddr, uSize); return true; }

2.CMemFile的读取(限定10M大小)

bool GetJsonByMemFile(LPCTSTR szMemFileName, CMyJsonObj& taskJson) { CString sErrMsg; HANDLE hMemFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE, szMemFileName); if(hMemFile == NULL) { DWORD dwErrCode = GetLastError(); sErrMsg.Format(_T("打开内存文件 %s 失败,错误码:%d"), szMemFileName, dwErrCode); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); return false; } LPVOID pMemFileData = MapViewOfFile(hMemFile, SECTION_MAP_READ, 0, 0, 0); if(pMemFileData == NULL) { DWORD dwErrCode = GetLastError(); sErrMsg.Format(_T("映射内存文件 %s 失败,错误码:%d"), szMemFileName, dwErrCode); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); CloseHandle(hMemFile); hMemFile = NULL; return false; } bool bRet = false; const char* szData = (const char*)pMemFileData; if( (szData[0] == 'A') && (szData[1] == 'B') && (szData[2] == 'C') && (szData[3] == 'D') ) { UINT nLen = *(UINT*)(szData + 4); szData += 8; if( (nLen > 0) && (nLen < 10*1024*1024) && (szData[nLen-1] == '\0') ) { bRet = true; UTF82TCHAR u2t(szData); if(taskJson.Load(u2t.Data()) == false) { sErrMsg.Format(_T("生成json失败:%s"), (LPCTSTR)taskJson.GetErrMsg()); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); bRet = false; } } else { sErrMsg.Format(_T("内存文件 %s 格式无效,数据长度 %u 超出最大允许值!"), szMemFileName, nLen); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); } } else { sErrMsg.Format(_T("内存文件 %s 格式无效!"), szMemFileName); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); } UnmapViewOfFile(pMemFileData); CloseHandle(hMemFile); return bRet; }

3.CMemFile的修改(读取、修改、覆盖重写)

bool ModifyJsonByMemFile(LPCTSTR szMemFileName) { CMyJsonObj taskJson; CString sErrMsg; HANDLE hMemFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE, szMemFileName); if(hMemFile == NULL) { DWORD dwErrCode = GetLastError(); sErrMsg.Format(_T("打开内存文件 %s 失败,错误码:%d"), szMemFileName, dwErrCode); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); return false; } LPVOID pMemFileData = MapViewOfFile(hMemFile, SECTION_MAP_READ, 0, 0, 0); if(pMemFileData == NULL) { DWORD dwErrCode = GetLastError(); sErrMsg.Format(_T("映射内存文件 %s 失败,错误码:%d"), szMemFileName, dwErrCode); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); CloseHandle(hMemFile); hMemFile = NULL; return false; } bool bRet = false; const char* szData = (const char*)pMemFileData; if( (szData[0] == 'H') && (szData[1] == 'C') && (szData[2] == 'M') && (szData[3] == 'E') ) { UINT nLen = *(UINT*)(szData + 4); szData += 8; if( (nLen > 0) && (nLen < 10*1024*1024) && (szData[nLen-1] == '\0') ) { bRet = true; UTF82TCHAR u2t(szData); if(taskJson.Load(u2t.Data()) == false) { sErrMsg.Format(_T("生成json失败:%s"), (LPCTSTR)taskJson.GetErrMsg()); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); bRet = false; } jsnPass.SetItem(_T("name"), _T("Liming")); jsnPass.SetItem(_T("age"), _T("20")); } else { sErrMsg.Format(_T("内存文件 %s 格式无效,数据长度 %u 超出最大允许值!"), szMemFileName, nLen); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); } } else { sErrMsg.Format(_T("内存文件 %s 格式无效!"), szMemFileName); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); } UnmapViewOfFile(pMemFileData); CloseHandle(hMemFile); // 重新写入新的内存 HANDLE hMemFileNew = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE, szMemFileName); if(hMemFileNew == NULL) { DWORD dwErrCode = GetLastError(); sErrMsg.Format(_T("打开内存文件 %s 失败,错误码:%d"), szMemFileName, dwErrCode); MessageBox(sErrMsg, _T("错误"), MB_OK|MB_ICONERROR); return false; } CString strJsonBuf = taskJson.CreateJson(); int nSize = Unicode2UTF8(strJsonBuf, NULL, 0); char* szJsonBuf = new char[nSize]; Unicode2UTF8(strJsonBuf, szJsonBuf, nSize); UINT uLen = (UINT)nSize; CMemFile mf(uLen + 8); char szHeader[4] = { 'A', 'B', 'C', 'D' }; mf.Write(szHeader, 4); mf.Write(&uLen, sizeof(UINT)); mf.Write(szJsonBuf, uLen); DWORD uSize = (DWORD)mf.GetLength(); BYTE* pData = mf.Detach(); PBYTE pMapAddr = reinterpret_cast<PBYTE>(::MapViewOfFile(hMemFileNew, FILE_MAP_WRITE, 0, 0, 0)); memcpy(pMapAddr, pData, uSize); // 拷贝数据到共享文件里。 FlushViewOfFile(pMapAddr, uSize); //UnmapViewOfFile(pMapAddr); CloseHandle(hMemFileNew); return bRet; }
最新回复(0)