www.pudn.com > TongXuLv_Manage.rar > MMFile.cpp


// MMFile.cpp: implementation of the CMMFile class. 
// 
////////////////////////////////////////////////////////////////////// 
#include "stdafx.h" 
#include "MMFile.h" 
CMMFile::CMMFile(BOOL autoDelete) 
{ 
	m_autoDelete=autoDelete; 
	m_hFile=NULL; 
	m_hFileMap=NULL; 
	m_lpFileMapBuffer=NULL; 
        m_pFileName=""; 
	m_pMapName=""; 
	m_dwSize=0; 
} 
 
CMMFile::~CMMFile() 
{ 
	Destroy(); 
} 
void CMMFile::Destroy() 
{ 
	if(m_lpFileMapBuffer) 
	{ 
		UnmapViewOfFile(m_lpFileMapBuffer); 
		m_lpFileMapBuffer=NULL; 
	} 
	 
	if(m_hFileMap) 
	{ 
		CloseHandle(m_hFileMap); 
		m_hFileMap=NULL; 
	} 
	 
	if(m_hFile&&m_hFile!=INVALID_HANDLE_VALUE) 
	{ 
		CloseHandle(m_hFile); 
		m_hFile=NULL; 
	} 
 
	if(m_pFileName!="") 
	{ 
		if(m_autoDelete) 
			DeleteFile(m_pFileName); 
		m_pFileName=""; 
	} 
 
	if(m_pMapName!="") 
	{ 
		m_pMapName=""; 
	} 
} 
BOOL CMMFile::WriteToFile(LPVOID pBuffer,DWORD dwSize) 
{ 
	if(!m_lpFileMapBuffer)return FALSE; 
	memcpy(m_lpFileMapBuffer,pBuffer,dwSize); 
	return TRUE; 
} 
BOOL CMMFile::WriteToFile(LPVOID pBuffer,DWORD dwOffsetAddr,DWORD dwSize) 
{ 
	if(!m_lpFileMapBuffer)return FALSE; 
	memcpy((BYTE*)m_lpFileMapBuffer+dwOffsetAddr,pBuffer,dwSize); 
	return TRUE; 
} 
BOOL CMMFile::ReadFromFile(LPVOID pBuffer,DWORD dwSize) 
{ 
	if(!m_lpFileMapBuffer)return FALSE; 
	memcpy(pBuffer,m_lpFileMapBuffer,dwSize); 
	return TRUE; 
} 
BOOL CMMFile::ReadFromFile(LPVOID pBuffer,DWORD dwOffsetAddr,DWORD dwSize) 
{ 
	if(!m_lpFileMapBuffer)return FALSE; 
	memcpy(pBuffer,(BYTE*)m_lpFileMapBuffer+dwOffsetAddr,dwSize); 
	return TRUE; 
} 
BOOL CMMFile::OpenMem(LPCTSTR szFileName, LPCTSTR szMapName, DWORD dwSize) 
{ 
	if(m_lpFileMapBuffer)return TRUE; 
	m_pFileName=szFileName; 
	m_pMapName=szMapName; 
	m_dwSize=dwSize; 
        m_hFileMap=OpenFileMapping(FILE_MAP_ALL_ACCESS,TRUE,m_pMapName); 
	if((!m_hFileMap)||(m_hFileMap==INVALID_HANDLE_VALUE)) 
	{ 
		if((!m_hFile)||(m_hFile==INVALID_HANDLE_VALUE)) 
		{ 
			if(dwSize==0) 
			{ 
				m_hFile=CreateFile(m_pFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
				if((!m_hFile)||(m_hFile==INVALID_HANDLE_VALUE)) 
				{ 
					return FALSE; 
				} 
			} 
			else 
			{ 
				m_hFile=CreateFile(m_pFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 
				if((!m_hFile)||(m_hFile==INVALID_HANDLE_VALUE)) 
				{ 
					return FALSE; 
				} 
			} 
		} 
		m_hFileMap=CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_dwSize,m_pMapName); 
		if((!m_hFileMap)||(m_hFileMap==INVALID_HANDLE_VALUE)) 
		{ 
			CloseHandle(m_hFile); 
			return FALSE; 
		} 
	} 
	if(!(m_lpFileMapBuffer=MapViewOfFile(m_hFileMap,FILE_MAP_ALL_ACCESS,0,0,m_dwSize))) 
	{ 
		DWORD ER=GetLastError(); 
		return FALSE; 
	} 
	return TRUE; 
} 
BOOL CMMFile::OpenNewMem(LPCTSTR szFileName, LPCTSTR szMapName, DWORD dwSize) 
{ 
  HANDLE hTmpFile; 
  hTmpFile=CreateFile(m_pFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
  if(hTmpFile) 
  { 
    CloseHandle(hTmpFile); 
    DeleteFile(m_pFileName); 
  } 
  return OpenMem(szFileName,szMapName,dwSize); 
} 
BOOL CMMFile::CloseMem() 
{ 
	if(m_lpFileMapBuffer) 
	{ 
		UnmapViewOfFile(m_lpFileMapBuffer); 
		m_lpFileMapBuffer=NULL; 
		return TRUE; 
	} 
	else 
		return FALSE; 
} 
void CMMFile::GetSysAllocationGranularity(DWORD* pAllocationGranularity) 
{ 
	SYSTEM_INFO sinf; 
	GetSystemInfo(&sinf); 
	*pAllocationGranularity=sinf.dwAllocationGranularity; 
} 
DWORD CMMFile::GetSize() 
{ 
	if(!m_hFile) 
		return 0; 
	return GetFileSize(m_hFile,NULL); 
}