内存映射读文件

封装类

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;
		}
		// 1:创建或打开一个文件内核对象
		m_hFile = CreateFile(m_szPath,//文件路径
			GENERIC_READ,				//只读
			FILE_SHARE_READ,			//只读共享
			NULL,						//默认安全属性
			OPEN_EXISTING,				//只打开已经存在的文件
			FILE_FLAG_SEQUENTIAL_SCAN,	//对该文件进行顺序操作而不是随机操作
			NULL/*一般为0*/);
		if (m_hFile == INVALID_HANDLE_VALUE)
		{
			szErr = "创建文件对象失败";
			return NULL;
		}
		
		DWORD dwFileSizeHigh;
		m_lFileSize = GetFileSize(m_hFile, &dwFileSizeHigh);
		m_lFileSize |= (((__int64)dwFileSizeHigh) << 32);

		// 2:创建一个文件映射内核对象
		m_hFileMapping = CreateFileMapping(
			m_hFile,					//文件对象句柄
			NULL,						//默认安全属性
			PAGE_READONLY,				//页面保护,只读
			0,							//需要的内存大小和打开的文件大小一样
			0,							//
			NULL						/*内存共享,不需要*/
		);
		if (m_hFileMapping == INVALID_HANDLE_VALUE)
		{
			DWORD ierr = GetLastError();
			szErr = "创建文件映射对象失败";
			return NULL;
		}
		// 3:将文件数据映射到进程的地址空间:
		m_pdata = MapViewOfFile(
			m_hFileMapping,//文件映射对象句柄
			FILE_MAP_READ,//映射文件只读
			0,//0表示从文件的头开始读取
			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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值