代码如下:
HANDLE hFile = CreateFile(lpszFileName,
                              GENERIC_READ,
                              FILE_SHARE_READ,
                              NULL,
                              OPEN_EXISTING,
                              0,
                              NULL);
    if (hFile == INVALID_HANDLE_VALUE) 
    {
        return FALSE;
    ULARGE_INTEGER uliSize;
    uliSize.LowPart = GetFileSize(hFile, &uliSize.HighPart);
m_hFileMapping= CreateFileMapping(hFile,NULL,PAGE_READONLY, uliSize.HighPart, uliSize.LowPart, "BigFile");
if (m_hFileMapping==NULL)
{
CloseHandle(hFile);
return FALSE;
}
m_pbFile = (LPBYTE)MapViewOfFile(m_hFileMapping, FILE_MAP_READ, 0, 0, 0);
if (m_pbFile == NULL)
{
CloseHandle(hFile);
CloseHandle(m_hFileMapping);
return FALSE;
}
m_pbData = m_pbFile;
    m_llSize = (LONGLONG)uliSize.QuadPart;   
    CloseHandle(hFile);有时候映射文件时MapViewOfFile出错,并不是每次出错!!!
请大家帮我解决!!!!!!!!!!!!!!

解决方案 »

  1.   

    用GetLastError()看看错误代码和原因。
      

  2.   

    同意楼上~~
    你看看m_hFileMapping返回值信息~~
      

  3.   

    // 你出错几乎是20%的几率了,把你这语句改一下就可以了m_hFileMapping= CreateFileMapping(hFile,NULL,PAGE_READONLY, uliSize.HighPart, uliSize.LowPart, NULL); // 最后一个参数设为NULL
      

  4.   

    参考我这个:BOOL ReadMapMemoNew(CString FileName)
    {
    HANDLE hMapping;
    LPSTR  lpData;
    HANDLE hOpenFile;
    BOOL   bRet; // 1. open file with handle
    cout << "open file:" << (LPCTSTR)FileName << endl;
    hOpenFile = CreateFile((LPCTSTR)FileName, 
                            GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
    0
                           );
    if(hOpenFile == INVALID_HANDLE_VALUE)
    {
    cout << "open file:" << (LPCTSTR)FileName << " failure, reason:" << GetLastError() <<  endl;
    return -1;
    }
    DWORD dwFileSize = GetFileSize(hOpenFile, NULL); // 2. Read file
    cout << "read file" << endl;
    char szWavHead[256] = { 0 };
    DWORD  nReadBytes = sizeof(szWavHead);
    bRet = ReadFile(hOpenFile, szWavHead, nReadBytes, &nReadBytes, NULL);
    if(!bRet)
    {
    cout << "Read file failure, reason :" << GetLastError() << endl;
    CloseHandle(hOpenFile);
        return -2;
    } // 2. map memory file
    cout << "create file map" << endl;
    hMapping = CreateFileMapping(hOpenFile, NULL, PAGE_READWRITE, 0, dwFileSize + sizeof(wave_file_head), NULL);
    if(hMapping == NULL)
    {
    cout << "CreateFileMapping() failed, reason: " << GetLastError() << endl;
    return -2;
    } lpData = (LPSTR)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if(!lpData)
    {
    cout << "MapViewOfFile() failed reason: " << GetLastError() << endl;
    return -3;
    } // 3. move memory
    cout << "move memory" << endl;
    memmove(lpData + sizeof(wave_file_head), lpData, dwFileSize); // 4. write header
    memcpy(lpData, "This is a test", 14); // 5. Unmap file, close handle
    cout << "unmap file" << endl;
    UnmapViewOfFile(lpData);
    CloseHandle(hOpenFile);
    //Sleep(2000); return TRUE;
    }
      

  5.   

    CreateFile===End 
    GetFileSize,HighPart= 0  LowPart= 232203939
    CreateFileMapping
    MapViewOfFile
    MapViewOfFile失败=8
    LoadFile=失败
    OPENFILE=End
    我的内存是512M,C:3G多空闲,上面是跟踪结果!
      

  6.   

    这样改行吗?
    m_hFileMapping= CreateFileMapping(hFile,NULL,PAGE_READONLY, 0, 0, NULL);
    if (m_hFileMapping == NULL)
    {
    CloseHandle(hFile);
    return FALSE;
    }
    CloseHandle(hFile);
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    DWORD dwGran = SysInfo.dwAllocationGranularity; DWORD dwFileSizeHigh;
    __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
    qwFileSize |= (((__int64)dwFileSizeHigh) << 32); __int64 qwFileOffset = 0;
    DWORD dwBlockBytes = 1000 * dwGran;
    if (uliSize.QuadPart < 1000 * dwGran)
    dwBlockBytes = (DWORD)uliSize.QuadPart;
    while (qwFileOffset > 0)
    {
    LPBYTE m_pbFile = (LPBYTE)MapViewOfFile(m_hFileMapping,FILE_MAP_READ,
    (DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
    if (m_pbFile == NULL)
    {
    CString s;
    s.Format("MapViewOfFile失败=%d",GetLastError());
    LogMsg(s);
    CloseHandle(hFile);
    CloseHandle(m_hFileMapping);
    return FALSE;
    }
    memmove(m_pbData, m_pbFile, dwBlockBytes);
    UnmapViewOfFile(m_pbFile);
    qwFileOffset += dwBlockBytes;
    qwFileSize -= dwBlockBytes;
    }
    m_pbData = m_pbFile;
        m_llSize = (LONGLONG)uliSize.QuadPart; 
    CloseHandle(m_hFileMapping);
      

  7.   

    难道就没高手解决这个问题吗??大家看过directshow过滤器的原过滤器吧,sdk中的读文件采用readfile缓冲对进,这样速度会很慢,所以改为文件映射形式读进。
      

  8.   

    从理论和实践上说filemapping不会比readfile更高效。当然前提是你不能乱用readfile,要适当控制好你的buffer,另外readfile还能使用异步IO,控制力比filemapping更高。
      

  9.   

    LPBYTE m_pbFile = (LPBYTE)MapViewOfFile(m_hFileMapping,FILE_MAP_READ,
    (DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
    =================
      
    完全没有必要用什么高位字节啊,你的文件最大也不过200多兆而已,32位的int最大可以有4GB。还有这个“
    CloseHandle(hFile);
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    DWORD dwGran = SysInfo.dwAllocationGranularity;DWORD dwFileSizeHigh;
    __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);”应该有问题,既然hFile已经关闭,你再取得的GetFileSize你注意过没有,应该是一个无效值。
    我的建议是不要搞什么高WORD,__int64的,一律用DWORD的一个低字就可以解决。具体你可以参考一下我上面的那个例子改写一下即可。