在看《windows核心编程》时,看到内存映射文件一章节,书中提到录音文件动态增长,作者也留下了连接关于他实现的“可增长的内存映射文件”的方法,我没找到,于是自己就试着写了一个,源代码贴出来,以供日后参考
void increaseFile() { using namespace std; HANDLE hFile = CreateFile( L"me", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); if (INVALID_HANDLE_VALUE == hFile) { cout << "CreateFile() failed:" << GetLastError() << endl; return; } unsigned int tIncreaseSize = 0; DWORD tFileSize = 0; const char* const pStr = "abcdefghijklmnopqrstuvwxyz"; while (true) { cin >> tIncreaseSize; if (0 == tIncreaseSize) { break; } tFileSize = GetFileSize(hFile, NULL); HANDLE hFileMapping = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, tFileSize + tIncreaseSize, L""); if (NULL == hFileMapping) { cout << "CreateFileMapping() failed:" << GetLastError() << endl; break; } // 将文件映射到内存的地址空间,就可以操作这个内存映射文件了 // 比如录音文件 // 创建1K大小的文件,写内存映射文件,满了,用此文件再重建内存映射文件,将大小扩大1K,将指针移动至原文件的大小处,写新申请1K空间 // 这样就可以实现不断的增长的内存映射文件 LPVOID pViewFile = MapViewOfFile( hFileMapping, FILE_MAP_READ|FILE_MAP_WRITE, 0,0,0); if (NULL == pViewFile) { break; } // 写数据 strcpy((char*)pViewFile + tFileSize, pStr); UnmapViewOfFile(pViewFile); CloseHandle(hFileMapping); } CloseHandle(hFile); }