封装类
class CmyFileMap
{
public:
CmyFileMap() { m_szPath = ""; m_pdata = NULL; };
CmyFileMap(CString szpath) { m_szPath = szpath; m_pdata = NULL; }
void* start(CString szpath)
{
m_szPath = szpath;
if (m_szPath == "")
{
return NULL;
}
m_hFile = CreateFile(m_szPath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
szErr = "创建文件对象失败";
return NULL;
}
DWORD dwFileSizeHigh;
m_lFileSize = GetFileSize(m_hFile, &dwFileSizeHigh);
m_lFileSize |= (((__int64)dwFileSizeHigh) << 32);
m_hFileMapping = CreateFileMapping(
m_hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL
);
if (m_hFileMapping == INVALID_HANDLE_VALUE)
{
DWORD ierr = GetLastError();
szErr = "创建文件映射对象失败";
return NULL;
}
m_pdata = MapViewOfFile(
m_hFileMapping,
FILE_MAP_READ,
0,
0,
0
);
if (!m_pdata)
{
szErr = "文件映射到内存空间失败";
CloseHandle(m_hFileMapping);
CloseHandle(m_hFile);
m_hFileMapping = INVALID_HANDLE_VALUE;
m_hFile = INVALID_HANDLE_VALUE;
return NULL;
}
return m_pdata;
};
void stop()
{
if (m_pdata)
{
UnmapViewOfFile(m_pdata);
}
if (m_hFileMapping != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFileMapping);
}
if (m_hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
}
m_pdata = NULL;
m_lFileSize = 0;
}
long long GetFileLen() { return m_lFileSize; };
int Getoffset() { return m_ioffset; };
void Setoffset(int ioff) { m_ioffset = ioff; };
private:
HANDLE m_hFile = INVALID_HANDLE_VALUE;
HANDLE m_hFileMapping = INVALID_HANDLE_VALUE;
CString szErr = "";
CString m_szPath;
void* m_pdata;
long long m_lFileSize = 0;
int m_ioffset = 0;
};
调用
bool onefilemap(CString& szPath,long long iFrame)
{
void* p = NULL;
CmyFileMap m;
p = m.start(szPath);
if (p)
{
long long index = 0;
for (long long i = 0; i < iFrame; i++)
{
memcpy(&iDataLen, (char*)p + index, sizeof(iDataLen));
index += sizeof(iDataLen);
DZ_SaveFScanData* pData = new DZ_SaveFScanData;
pData->GetObject((char*)p + index, iDataLen);
index += iDataLen;
if (pData->iFreqCount == 239201 && pData->iStartFreq == fti.pFFI[0].iStartFreq && pData->iStep == fti.pFFI[0].iStepFreq)
{
SumFirstSlevel += pData->sLevel[0];
ifram++;
}
delete pData;
pData = NULL;
}
}
m.stop();
}