www.pudn.com > ScanDlg.rar > MemMapFile.h


///////////////////////////////////////////////////////////////////////////// 
//                                                                         // 
//         用途 : 内存映射的 - 文件操作 ( Memory Mapping File )            // 
//         创建 : [sck007] / 2003-03-27                                    // 
//         更新 : 2003-10-28                                               // 
//         主页 : www.tcsy.net                                             // 
//         邮箱 : sck007@163.com                                           // 
//                                     (c) 1996 - 2008 =TCSY= 单成坤       // 
///////////////////////////////////////////////////////////////////////////// 
#ifndef  __SCK_MEMMAPFILE_H__ 
#define  __SCK_MEMMAPFILE_H__ 
#pragma once 
 
//=========================================================================== 
//	Declaration 
//=========================================================================== 
 
// 内存映射失败信息:相关指针或句柄为NULL或无效 
class CMemMapFile 
{ 
protected : 
	HANDLE	m_hFile ; 
	HANDLE	m_hFileMap ; 
	VOID	* m_pMapAddress ; 
	void	UnMapFile () ; 
 
public : 
	CMemMapFile () ; 
	~CMemMapFile () ; 
	BYTE  * GetMapPtr (void) ; 
	DWORD GetFileSize (void) ; 
 
	/*************************************************************/ 
	/* 覆盖只读文件会失败,确认创建                              */ 
	/*************************************************************/ 
	void *	CreateNewFile (LPCTSTR szFileName, DWORD dwMaxFileSize) ; 
	void *	OpenExistFile (LPCTSTR szFileName, DWORD dwMaxFileSize) ; 
 
	/*************************************************************/ 
	/* 读取文件长度为0的文件会失败,只读                         */ 
	/*************************************************************/ 
	void *	OpenReadFile (LPCTSTR szFileName); 
 
	/*************************************************************/ 
	/* 按定值设置最终文件大小,结束映射,并关闭文件              */ 
	/*************************************************************/ 
	void	CloseSizeFile (DWORD dwFileSize) ; 
} ; 
 
//=========================================================================== 
//	Implement 
//=========================================================================== 
 
// 默认构造函数 
inline CMemMapFile::CMemMapFile () 
{ 
	m_hFile = INVALID_HANDLE_VALUE ; 
	m_hFileMap = NULL ; 
	m_pMapAddress = NULL ; 
} 
 
// 默认析构函数 
inline CMemMapFile::~CMemMapFile () 
{ 
	this->UnMapFile () ; 
} 
 
// 当前文件是否可用:返回映象首指针 
inline BYTE * CMemMapFile::GetMapPtr (void) 
{ 
	return ((BYTE *)m_pMapAddress) ; 
} 
 
// 获取文件大小 
inline DWORD CMemMapFile::GetFileSize (void) 
{ 
	return (m_hFile==INVALID_HANDLE_VALUE ? 0 : ::GetFileSize(m_hFile, NULL)); 
} 
 
// 结束映射,并关闭文件,它保持原来打开时的文件大小,不改变它 
inline void CMemMapFile::UnMapFile () 
{ 
	if (m_pMapAddress != NULL)				::UnmapViewOfFile (m_pMapAddress) ; 
	if (m_hFileMap != NULL)					CloseHandle (m_hFileMap) ; 
	if (m_hFile != INVALID_HANDLE_VALUE)	CloseHandle (m_hFile) ; 
	m_pMapAddress = NULL ; 
	m_hFileMap = NULL ; 
	m_hFile = INVALID_HANDLE_VALUE ; 
} 
 
// 主动确认设置新大小,并关闭。该文件要能读写操作。它的调用必须放在最后 
inline void CMemMapFile::CloseSizeFile (DWORD dwFileSize) 
{ 
	if (m_pMapAddress != NULL)		::UnmapViewOfFile (m_pMapAddress) ; 
	if (m_hFileMap != NULL)			CloseHandle (m_hFileMap) ; 
	m_pMapAddress = NULL ; 
	m_hFileMap = NULL ; 
	if (m_hFile != INVALID_HANDLE_VALUE) 
	{ 
		::SetFilePointer (m_hFile, dwFileSize, NULL, FILE_BEGIN) ; 
		::SetEndOfFile (m_hFile) ; 
	} 
	this->UnMapFile () ; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
#endif