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 ); }