www.pudn.com > GameEngine_src.rar > CEPKFile.cpp


// CEPKFile.cpp: implementation of the CEPKFile class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "CEPKFile.h" 
#include "BaseUtil.h" 
#include "normal.h" 
#include  
#include  
#include  
 
 
using std::cout; 
using std::endl; 
 
const int HASH_SIZE = 521; 
 
 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
CEPKFile::CEPKFile() 
{ 
	m_opentype = EPK_NONE; 
	m_pfile		= NULL; 
	m_buffer	= NULL; 
	m_bufsize	= 0; 
	m_fileheader.epkNumOfFile = 0; 
} 
 
CEPKFile::~CEPKFile() 
{ 
	m_hashtable.Free(); 
	SafeDeleteArray( m_buffer ); 
 
	 
} 
 
 
 
////////////////////////////////////////////////////////////////////// 
//以指定方式打开一个EPK文件 
////////////////////////////////////////////////////////////////////// 
bool CEPKFile::Open( char *filename, enum EPK_OPEN_TYPE opentype ) 
{ 
	/******************************************************** 
	*为了保护游戏资源,此函数内容省略 
	********************************************************/ 
	return true; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//往一个EPK文件里插入一个文件 
//注意去除路径的文件名不能超过32个字符 
////////////////////////////////////////////////////////////////////// 
bool CEPKFile::Write( char *filename ) 
{ 
	/******************************************************** 
	*为了保护游戏资源,此函数内容省略 
	********************************************************/ 
	return true; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//在EPK文件读取一个文件 
//注意去除路径的文件名不能超过32个字符 
////////////////////////////////////////////////////////////////////// 
BYTE *CEPKFile::Read( const char *szFileName, int *pFileSize ) 
{ 
	/******************************************************** 
	*为了保护游戏资源,此函数内容省略 
	********************************************************/ 
	return NULL; 
} 
 
////////////////////////////////////////////////////////////////////// 
//关闭文件: 将文件头,哈希表写入文件中,关闭文件.释放数据 
////////////////////////////////////////////////////////////////////// 
void CEPKFile::Close() 
{ 
	/******************************************************** 
	*为了保护游戏资源,此函数内容省略 
	********************************************************/ 
} 
 
////////////////////////////////////////////////////////////////////// 
//获取EPK文件里存储的文件列表,如果失败或EPK里没有文件,则pnum将为0 
////////////////////////////////////////////////////////////////////// 
bool CEPKFile::GetFileList( FILEINFO **ppfilelist, int *pnum ) 
{ 
	/******************************************************** 
	*为了保护游戏资源,此函数内容省略 
	********************************************************/ 
	return true; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//获取一个文件的长度 
////////////////////////////////////////////////////////////////////// 
DWORD CEPKFile::GetFileSize( FILE *fp ) 
{ 
	if ( fp == NULL ) 
		return 0; 
 
	fseek( fp, 0, SEEK_SET ); 
	fseek( fp, 0, SEEK_END ); 
	fpos_t size; 
	fgetpos( fp, &size ); 
	fseek( fp, 0, SEEK_SET ); 
 
	return (DWORD)size; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//获取不带路径的文件名 
//如果成功则返回文件名的长度,失败返回0 
////////////////////////////////////////////////////////////////////// 
int CEPKFile::GetFileNameWithoutPath( const char *namein, char *nameout, int size ) 
{ 
	if ( namein == NULL || NULL == nameout ) 
		return false; 
 
	int len = strlen( namein ); 
	 
	for ( int i = len - 1; i >= 0; --i ) 
	{ 
		if ( namein[i] == '\\' || namein[i] == '/' ) 
			break; 
	} 
 
	if ( i == len-1 )			//如果失败 
		return 0; 
 
	memset( nameout, 0, size ); 
 
	int k = 0; 
	for ( int j = i+1; j < len; ++j ) 
		nameout[k++] = namein[j]; 
 
	return k; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//分配缓冲池 
////////////////////////////////////////////////////////////////////// 
bool CEPKFile::SetBuffer( int bufsize ) 
{ 
	if ( bufsize > m_bufsize ) 
	{ 
		if ( m_buffer != NULL ) 
		{ 
			delete [] m_buffer; 
			m_buffer = NULL; 
		} 
 
		m_buffer = new BYTE[ bufsize ]; 
		if ( m_buffer == NULL ) 
			return false; 
 
		m_bufsize = bufsize; 
	} 
 
	return true; 
} 
 
 
//------------------------------------------------FILEINFO类实现------------------------------------------------- 
FILEINFO::FILEINFO() 
{ 
	memset( m_szFileName, 0, 32 ); 
	m_iFilePos = 0; 
	m_iFileSize= 0; 
} 
 
FILEINFO::~FILEINFO() 
{ 
	 
} 
 
FILEINFO::FILEINFO( const FILEINFO &fileinfo ) 
{ 
	memcpy( m_szFileName, fileinfo.m_szFileName, 32 ); 
	m_iFilePos		= fileinfo.m_iFilePos; 
	m_iFileSize		= fileinfo.m_iFileSize; 
} 
 
FILEINFO &FILEINFO::operator = ( const FILEINFO &fileinfo ) 
{ 
	if ( this == &fileinfo ) 
		return *this; 
 
	memcpy( m_szFileName, fileinfo.m_szFileName, 32 ); 
	m_iFilePos		= fileinfo.m_iFilePos; 
	m_iFileSize		= fileinfo.m_iFileSize; 
 
	return *this; 
} 
 
int FILEINFO::operator % ( int i ) const 
{ 
	int sum = 0; 
	for ( int j = 0; j < 32; ++j ) 
	{ 
		sum += m_szFileName[j]; 
	} 
	 
	return sum % i; 
} 
 
bool FILEINFO::operator == ( const FILEINFO &fileinfo ) 
{ 
	if ( memcmp( m_szFileName, fileinfo.m_szFileName, 32 ) == 0 ) 
		return true; 
 
	return false; 
} 
 
void FILEINFO::SetFileName( const char *filename ) 
{ 
	int size = strlen(filename); 
	if (size>32) size = 32; 
 
	memcpy( m_szFileName, filename, size ); 
}