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


///////////////////////////////////////////////////////////////////////////// 
// MemMapFile.cpp   内存映射的 - 文件操作 ( Memory Mapping File )          // 
// CopyRight(C)   1996,2008   TCSY 公司                                    // 
// Pentium Working Room   ShanChengKun   2003.10.28   更新                 // 
///////////////////////////////////////////////////////////////////////////// 
#include "stdafx.h" 
#include "MemMapFile.h" 
 
//=========================================================================== 
// 执着地按指定大小映射文件,没有则创建,有则直接打开,覆盖只读文件会失败 
//=========================================================================== 
void * CMemMapFile::CreateNewFile (LPCTSTR szFileName, DWORD dwMaxFileSize) 
{ 
	this->UnMapFile () ; 
	m_hFile = ::CreateFile (szFileName, GENERIC_READ | GENERIC_WRITE, 
							FILE_SHARE_READ, NULL, CREATE_ALWAYS, 
							FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) ; 
	if (m_hFile == INVALID_HANDLE_VALUE) 
		return NULL ; 
 
	m_hFileMap = ::CreateFileMapping (m_hFile, NULL, PAGE_READWRITE, 0, dwMaxFileSize, NULL) ; 
	if (m_hFileMap == NULL) 
	{ 
		::CloseHandle (m_hFile) ; 
		m_hFile = INVALID_HANDLE_VALUE ; 
		return NULL ; 
	} 
 
	m_pMapAddress = ::MapViewOfFile (m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0) ; 
	if (m_pMapAddress == NULL) 
		this->UnMapFile () ; 
	return (void *)m_pMapAddress ; 
} 
 
//=========================================================================== 
// 执着地按指定大小映射文件,没有则创建,有则直接打开,覆盖只读文件会失败 
//=========================================================================== 
void * CMemMapFile::OpenExistFile (LPCTSTR szFileName, DWORD dwMaxFileSize) 
{ 
	this->UnMapFile () ; 
	m_hFile = ::CreateFile (szFileName, GENERIC_READ | GENERIC_WRITE, 
							FILE_SHARE_READ, NULL, OPEN_ALWAYS, 
							FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) ; 
	if (m_hFile == INVALID_HANDLE_VALUE) 
		return NULL ; 
 
	m_hFileMap = ::CreateFileMapping (m_hFile, NULL, PAGE_READWRITE, 0, dwMaxFileSize, NULL) ; 
	if (m_hFileMap == NULL) 
	{ 
		::CloseHandle (m_hFile) ; 
		m_hFile = INVALID_HANDLE_VALUE ; 
		return NULL ; 
	} 
 
	m_pMapAddress = ::MapViewOfFile (m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0) ; 
	if (m_pMapAddress == NULL) 
		this->UnMapFile () ; 
	return (void *)m_pMapAddress ; 
} 
 
//=========================================================================== 
// 只读方式打开并映射指定的已经存在的文件,并发的程序可以只读的方式访问 
//=========================================================================== 
void * CMemMapFile::OpenReadFile (LPCTSTR szFileName) 
{ 
	this->UnMapFile () ; 
	m_hFile = ::CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, 
							OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ; 
	if (m_hFile == INVALID_HANDLE_VALUE) 
		return NULL ; 
 
	m_hFileMap = ::CreateFileMapping (m_hFile, NULL, PAGE_READONLY, 0, 0, NULL) ; 
	if (m_hFileMap == NULL) 
	{ 
		::CloseHandle (m_hFile) ; 
		m_hFile = INVALID_HANDLE_VALUE ; 
		return NULL ; 
	} 
 
	m_pMapAddress = ::MapViewOfFile (m_hFileMap, FILE_MAP_READ, 0, 0, 0) ; 
	if (m_pMapAddress == NULL) 
		this->UnMapFile () ; 
	return (void *)m_pMapAddress ; 
} 
 
/////////////////////////////////////////////////////////////////////////////