windows内存映射文件

2006年写的,备用


class CS_MemFileStream  
{
public:
	enum CS_MemFileStream_State
	{Normal,Error,In,Out,Open,Close};
public:
	CS_MemFileStream();
	~CS_MemFileStream();
	
	inline void open(CString &sFileName,const int mode = ios::in)
	{open(sFileName.GetBuffer(0),mode);}
	void open(char *pcFileName,const int mode = ios::in);
	void read_block();
	inline void close()		
	{		
		if(lpvFile)	UnmapViewOfFile(lpvFile);
		if(hMap)	CloseHandle(hMap);
		if(hFile)	CloseHandle(hFile);
		
		hFile = NULL;
		hMap = NULL;
		lpvFile = NULL;
	}
	inline int eof(){return iState==Error;}
	//
	void getline(char *pDest, int iMaxSize,UCHAR cFlag = 0xA);
private:
	HANDLE hFile;						// File handle	
	HANDLE hMap;				// File mapping handle
	LPVOID lpvFile;
	long   pos;
	long file_size;//all
	long keep_size;//not read
	long read_size;//read one block or less
	long sys_granularity;
	int iState;
};
#include "stdafx.h"
#include "S_MemFileStream.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CS_MemFileStream::CS_MemFileStream()
		:	hFile(NULL),
			hMap(NULL),
			lpvFile(NULL),
			iState(Normal),
			file_size(0),
			keep_size(0),
			read_size(0),
			pos(0)
{
}

CS_MemFileStream::~CS_MemFileStream()
{
	close();
}

void CS_MemFileStream::open(char *pcFileName,const int mode)		
{		
	hFile = CreateFile
		(pcFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING,
		FILE_ATTRIBUTE_READONLY, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		hFile = NULL;
		hMap = NULL;
		lpvFile = NULL;
		iState = Error;
		return;
	}
	
	hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
	if (hMap == NULL)
	{
		CloseHandle(hFile);	
		hFile = NULL;
		hMap = NULL;
		lpvFile = NULL;
		iState = Error;
		return;
	}
	//
	DWORD dwFileSizeHigh;
	file_size = GetFileSize(hFile, &dwFileSizeHigh);
	keep_size = file_size;
	if(dwFileSizeHigh)
	{
		iState = Error;
	}
	//
#if defined(ReadStandardGDFFile)
	CSASSERT(false,"file name:%s",pcFileName);
	CSASSERT(false,"file size:%d bytes",file_size);
	ASSERT(file_size%82 == 0);//标准GDF文件
#endif
	//
	SYSTEM_INFO sysInfor;
	GetSystemInfo(&sysInfor);
	sys_granularity = sysInfor.dwAllocationGranularity;
	sys_granularity <<= 10;
	//
	if(keep_size < sys_granularity)
	{
		read_size = keep_size;
	}
	else
	{
		read_size = sys_granularity;
	}
	lpvFile = MapViewOfFile
		(hMap, FILE_MAP_READ, 0, file_size-keep_size, read_size);
	keep_size -= read_size;
	if (lpvFile == NULL)
	{
		TRACE("映射文件映射失败,错误代码:%d\r\n",GetLastError());
		CloseHandle(hMap);
		CloseHandle(hFile);
		hFile = NULL;
		hMap = NULL;
		lpvFile = NULL;
		iState = Error;
		return;
	}
	//
	return;
}
void CS_MemFileStream::read_block()
{
	pos = 0;
	if(lpvFile)
	{
		UnmapViewOfFile(lpvFile);
		lpvFile = NULL;
	}
	if(keep_size > 0)
	{
		if(keep_size<sys_granularity)
		{
			read_size = keep_size;
		}
		else
		{
			read_size = sys_granularity;
		}
		lpvFile = MapViewOfFile
			(hMap, FILE_MAP_READ, 0, file_size-keep_size, read_size);
		keep_size -= read_size;
		if (lpvFile == NULL)
		{
			TRACE("映射文件映射失败,错误代码:%d\r\n",GetLastError());
			CloseHandle(hMap);
			CloseHandle(hFile);
			hFile = NULL;
			hMap = NULL;
			lpvFile = NULL;
			iState = Error;
			return;
		}
	}
	else
	{
		read_size = 0;
		iState = Error;
		return;
	}
}

void CS_MemFileStream::getline(char *pDest, int iMaxSize,UCHAR cFlag)
{
#if !defined(ReadStandardGDFFile)
	char *pTemp = ((char *)lpvFile)+pos;
	while(iMaxSize--)
	{
		if(pos++>read_size)
		{
			read_block();
			if(eof())
				return;
		}
		if(*pTemp != cFlag)
		{
			*pDest++ = *pTemp++;
		}
		else
		{
			*pDest = 0;
			return;
		}
	}
#else
	if(pos+82<=read_size)
	{
		memcpy(pDest , ((BYTE *)lpvFile + pos) , 80);
		*(pDest+80) = 0;
		pos += 82;
	}
	else
	{
		char *pDestTemp = pDest;
		memcpy(pDestTemp , ((BYTE *)lpvFile + pos) , read_size-pos);
		pDestTemp += (read_size-pos);
		read_block();
		if(eof())
			return;
		memcpy(pDestTemp , ((BYTE *)lpvFile + pos) , pDest+82-pDestTemp);
		*(pDest+80) = 0;
		pos += (pDest+82-pDestTemp);
	}
#endif
}

猜你喜欢

转载自blog.csdn.net/weixin_43172531/article/details/103764396