文件动态增长

在看《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);
}
原文地址:https://www.cnblogs.com/emyueguang/p/3186779.html