初始化的时候:
m_hFile = ::CreateFile(m_FileName.c_str(),GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_ALWAYS, 
FILE_FLAG_SEQUENTIAL_SCAN, NULL);


m_qwFileSize = 0x4000000;
        m_qwFileOffset = 0;
m_T = 600 * m_siInfo.dwAllocationGranularity;
m_dwBytesInBlock = 1000 * m_siInfo.dwAllocationGranularity; m_hMappingFile = ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL);

::CloseHandle(m_hFile);

m_lpStartLoc = ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS,
static_cast<DWORD>(m_qwFileSize >> 32),static_cast<DWORD>(m_qwFileOffset & 0xFFFFFFFF),m_dwBytesInBlock);然后当使用率到达60%的时候,重新创建内存映射,但是说我无法访问!!
         if (m_qwFileOffset > m_T)
{
m_T = m_qwFileOffset + 600 * m_siInfo.dwAllocationGranularity;
::UnmapViewOfFile(m_lpStartLoc); DWORD dwHi = static_cast<DWORD>(m_qwFileOffset >> 32);
DWORD dwLo = static_cast<DWORD>(m_qwFileOffset & 0xFFFFFFFF); RndToSysAllocGranularity(dwHi);
RndToSysAllocGranularity(dwLo); m_lpStartLoc = ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS,dwHi,
dwLo,m_dwBytesInBlock);
}
RndToSysAllocGranularity是用于做分配粒度处理。
DWORD dwDevided = dwValue / m_siInfo.dwAllocationGranularity;//分配了多少粒度
DWORD dwRemains = dwValue % m_siInfo.dwAllocationGranularity; if (dwRemains)
dwValue = (dwDevided + 1) * m_siInfo.dwAllocationGranularity;//分配一个新的粒度。麻烦高人看看。觉得很纳闷,我估计是分配粒度这边的问题,但是不知道如何修改。

解决方案 »

  1.   

    m_hFile   =   ::CreateFile(m_FileName.c_str(),GENERIC_WRITE   ¦   GENERIC_READ,   0,   NULL,   OPEN_ALWAYS,   
    FILE_FLAG_SEQUENTIAL_SCAN,   NULL); 
    m_qwFileSize   =   0x4000000; 
                    m_qwFileOffset   =   0; 
    m_T   =   600   *   m_siInfo.dwAllocationGranularity; 
    m_dwBytesInBlock   =   1000   *   m_siInfo.dwAllocationGranularity; m_hMappingFile   =   ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL); //::CloseHandle(m_hFile); m_lpStartLoc   =   ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS, 
    static_cast <DWORD> (m_qwFileSize   > >   32),static_cast <DWORD> (m_qwFileOffset   &   0xFFFFFFFF),m_dwBytesInBlock); 
      

  2.   

    使用文件而不是系统内存交换页的CreateFileMapping后MapViewOfFile要注意访问该内存的语句必须用try包起来, 因为很有可能会出现缺页错误--msdn上说的
      

  3.   

    谢谢哈。但这个不是问题的关键。
    换个方法提问吧:
    当View的位移超过一个阈值的时候,我会重新CreateFile、CreateFileMapping、MapViewOfFile,这样的思路难道有错?!
      

  4.   

    这样正常情况是对的,你还是用try吧。看那有异常
      

  5.   

    我的看法是当你CreateFileMapping的时候,指定了你的Mapping大小,如果超过了Mapping大小,那么就会Crash了。当时我的疑问又来了,在超过大小的时候,我再次CreateFileMapping,还是会Crash。
      

  6.   

    这里有问题吧.
    m_hMappingFile   =   ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL); ::CloseHandle(m_hFile);
    这样再试试
    ::UnmapViewOfFile(m_lpStartLoc);
    ::CloseHandle(m_hMappingFile);
    m_hMappingFile   =   ::CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_qwFileSize,NULL); 
      

  7.   

    m_lpStartLoc   =   ::MapViewOfFile(m_hMappingFile,FILE_MAP_ALL_ACCESS, 
    static_cast <DWORD> (m_qwFileSize   > >   32),static_cast <DWORD> (m_qwFileOffset   &   0xFFFFFFFF),m_dwBytesInBlock红色的两处是笔误码?
      

  8.   

    问题搞定,原因是一旦你MapViewOfFile以后,文件句柄必须保存。
    [pre]
    if (!m_hFile || INVALID_HANDLE_VALUE == m_hFile)
    m_hFile = ::CreateFile(m_szFileName.c_str(),
    GENERIC_READ | GENERIC_WRITE,
    0, 
    NULL,
    OPEN_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL, 
    NULL);
    if (!m_hFile || INVALID_HANDLE_VALUE == m_hFile)
    {
    AfxMessageBox("C_DumpSRParas::CreateMem() Error!");
    return false;
    } //::SetFilePointer(m_hFile,0,NULL,FILE_END);
    DWORD dwSysGran = m_si.dwAllocationGranularity;
    DWORD dwFileSizeLo = 0;
    DWORD dwFileSizeHi = 0;
    dwFileSizeLo = ::GetFileSize(m_hFile,&dwFileSizeHi);
    __int64 qwFileSizeHi = dwFileSizeHi;
    qwFileSizeHi <<= 32;
    __int64 qwFileSize = dwFileSizeLo | qwFileSizeHi; 
    if (qwFileSize == 0)
    {
    DWORD dwWritten = 0;
    CString str;
    str = _T("\r\n");
    ::WriteFile(
    m_hFile,
    (LPCTSTR)str,
    str.GetLength(),
    &dwWritten,
    NULL);
    }
    dwFileSizeLo = ::GetFileSize(m_hFile,&dwFileSizeHi);
    qwFileSize = dwFileSizeLo | qwFileSizeHi; __int64 qwFileMapStart = qwFileSize / dwSysGran * dwSysGran;
    DWORD dwMapViewSize = (static_cast<DWORD>(qwFileMapStart) % dwSysGran) + m_si.dwAllocationGranularity; //size of the file mapping view
    __int64 qwFileMapSize = qwFileSize + m_si.dwAllocationGranularity; // How large will the file mapping object be? // The data of interest isn't at the beginning of the
    // view, so determine how far into the view to set the pointer.
    DWORD dwViewDelta = static_cast<DWORD>(qwFileSize - qwFileMapStart); m_hMem = ::CreateFileMapping(m_hFile,
    NULL,
    PAGE_READWRITE,
    static_cast<DWORD>(qwFileMapSize >> 32),
    static_cast<DWORD>(qwFileMapSize & 0xffffffff),
    NULL);
    if (m_hMem == NULL || INVALID_HANDLE_VALUE == m_hMem)
    {
    ::CloseHandle(m_hFile);
    m_hFile = NULL;
    AfxMessageBox("C_DumpSRParas::CreateMem() Error!");
    return false;
    } m_pMemoryBlockBase = reinterpret_cast<LPDWORD>(::MapViewOfFileEx(
    m_hMem,
    FILE_MAP_ALL_ACCESS,
    static_cast<DWORD>(qwFileMapStart >> 32),
    static_cast<DWORD>(qwFileMapStart & 0xffffffff),
    dwMapViewSize, //Number of bytes to map
    NULL));
    if (!m_pMemoryBlockBase)
    {
    ::CloseHandle(m_hFile);
    m_hFile = NULL;
    ::CloseHandle(m_hMem);
    m_hMem = NULL; AfxMessageBox("C_DumpSRParas::CreateMem() Error!");
    return false;
    } m_pbtData = static_cast<LPBYTE>(m_pMemoryBlockBase) + dwViewDelta;
    m_dwOffset += dwViewDelta;
    m_dwOffset %= m_si.dwAllocationGranularity;
    [/pre]