内存映像文件有没有预读机制?
怎么通过它在文件指定位置写入? 怎么在文件中分配新空间?(就是写入新内容?)

解决方案 »

  1.   


    void CRiftGameProDlg::TestCfile()
    {
    //
    CFileDialog fileDlg(TRUE,_T("*.txt"),_T("*.txt"),NULL,_T("文本文件(*.txt)|*.txt||"),this);
    //fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
    //fileDlg.m_ofn.lpstrFileTitle = _T("通过内存映射文件读取数据");
    if (fileDlg.DoModal() == IDOK)
    {
    //创建文件对象
    HANDLE hFile = CreateFile(fileDlg.GetPathName(),GENERIC_READ|GENERIC_WRITE,0,NULL,
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
    TRACE ("创建文件对象失败,错误代码:%d\r\n",GetLastError());
    return;
    }
    //创建文件映射对象
    HANDLE hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
    if (hFileMap == NULL)
    {
    TRACE("创建文件映射对象失败,错误代码:%d\r\n",GetLastError());
    return;
    }
        //得到系统分配颗粒
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    DWORD dwGran = SysInfo.dwAllocationGranularity;
    //得到文件尺寸
    DWORD dwFileSizeHigh;
    __int64 qwFileSize = GetFileSize(hFile,&dwFileSizeHigh);
    qwFileSize  |= (((__int64)dwFileSizeHigh)<<32);
        //关闭文件对象
    CloseHandle(hFile);
    //偏移地址
    __int64 qwFileOffset = 0;
    //块大小
    DWORD dwBlockBytes = dwGran;
    while (qwFileSize >0)
    {
             //映射视图
    if (qwFileSize<dwGran)
    dwBlockBytes = (DWORD)(qwFileSize);
    LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
    if (lpbMapAddress == NULL)
    {
    TRACE("映射文件映射失败,错误代码:%d\r\n",GetLastError());
    return;
    }
    //对映射的视图碱性访问
    for (DWORD i = 0; i<dwBlockBytes;i++)
    {
    BYTE temp = *(lpbMapAddress+i);
    } //撤销文件映射
    UnmapViewOfFile(lpbMapAddress);
    //修正参数
    qwFileOffset += dwBlockBytes;
    qwFileSize -= dwBlockBytes;
    }
    //关闭文件映射对象句柄
    CloseHandle(hFileMap);
    AfxMessageBox(_T("成功完成对文件的访问"));

    }
    }自己看看对你有帮助不,还不行的话看下WINDOWS核心编程第17章(内存映射文件)