void CMpqPackGen::DoPacking() { // 日志文件 CHAR szTempFile[MAX_PATH] = {0}; ::GetCurrentDirectory( MAX_PATH, szTempFile ); ::PathAppend( szTempFile, "PackGen.log" ); m_pGenLogFile = fopen( szTempFile, "w" ); if( !m_pGenLogFile ) { char szMsg[ MAX_PATH ]; _snprintf(szMsg, MAX_PATH, "日志文件%s创建失败!", szTempFile); MessageBox(NULL, szMsg, "ERROR", MB_OK|MB_ICONSTOP); return; } CHAR szTempErrFile[MAX_PATH] = {0}; ::GetCurrentDirectory( MAX_PATH, szTempErrFile ); ::PathAppend( szTempErrFile, "PackGenError.log" ); m_pErrorLogFile = fopen( szTempErrFile, "w" ); if( !m_pErrorLogFile ) { char szMsg[ MAX_PATH ]; _snprintf(szMsg, MAX_PATH, "文件错误日志 %s创建失败!", szTempFile); MessageBox(NULL, szMsg, "ERROR", MB_OK|MB_ICONSTOP); return; } for( int i=0;i<m_iPackTotal;i++ ) { if ( m_iPackPotion == 0 || m_iPackPotion == i+1 ) { int FileNum = 0; //统计文件个数,以决定HashTable大小 vector<string>::iterator it = m_vecPackInfo[i].vecPackPath.begin(); for ( ;it!= m_vecPackInfo[i].vecPackPath.end();it++ ) { int num = BrowseDirectory(NULL,*it, m_vecPackInfo[i].vecExt,false); FileNum += num; } FileNum = FileNum * 1.5; //Hash表大小是文件实际个数的1.5倍 if ( FileNum<MIN_HASH_TABLE_SIZE ) FileNum = MIN_HASH_TABLE_SIZE; if (FileNum>MAX_HASH_TABLE_SIZE) { MessageBox(NULL, "Hash表太大,请检查文件个数", "ERROR", MB_OK|MB_ICONSTOP); return; } DWORD R = 0; string PackName = m_vecPackInfo[i].strPackName + ".mpq"; TKPMArchive* pArchive = KPM_CreateArchive( PackName.c_str(), R,FileNum , USE_TYPE_PATCH); printf( "\n ==============================" ); printf( "\n PackName: %s", PackName.c_str() ); printf( "\n" ); it = m_vecPackInfo[i].vecPackPath.begin(); for ( ;it!= m_vecPackInfo[i].vecPackPath.end();it++ ) { int num = BrowseDirectory(pArchive,*it, m_vecPackInfo[i].vecExt,true); FileNum += num; } KPM_CloseArchive(pArchive); } } printf( "\n PackGen OK!" ); }//DoPacking end
int main( int argc, char* argv[] ) { #if TEST_MPQ CMpqPackGen PackGen; PackGen.GetConfigInfo(); PackGen.ShowPackInfo(); int temp = 0; printf( "\n输入要打包的号码:" ); scanf( "%d", &temp ); PackGen.SetPackPotion(temp); PackGen.DoPacking(); #else //以下为功能演示代码 // 遍历MPQ包得到所有文件名 DWORD R; FILE_FIND_DATA sf; BOOL bFound = TRUE; TKPMArchive* pArchive = KPM_OpenArchive( str, R ); TKPMFile* pFile2 = KPM_FileOpen(pArchive,"../public/config/xf.tab",R); TKPMSearch* hFind = KPM_FindFirstFile(pArchive,"*",&sf); int j = 0; while(hFind != NULL && bFound != FALSE) { if ( strcmp(sf.cFileName, LISTFILE_NAME) != 0 && strcmp(sf.cFileName, SIGNATURE_NAME) != 0 && strcmp(sf.cFileName, ATTRIBUTES_NAME) != 0 ) { DWORD Read; unsigned char * Buffer = new unsigned char[sf.dwFileSize]; TKPMFile* pFile = KPM_FileOpen(pArchive,sf.cFileName,R); KPM_ReadFile(pFile,Buffer,sf.dwFileSize,&Read); KPM_FileEof(pFile); KPM_FileClose(pFile); printf("%s\n",sf.cFileName); j++; } bFound = KPM_FindNextFile(hFind,&sf); } KPM_SearchClose(hFind); KPM_CloseArchive(pArchive); #endif //DWORD R; // //TKPMArchive* pArchive = KPM_CreateArchive("d:\\a.mpq",R); //KPM_AddFile(pArchive,"d:\\b.txt","b.txt",KPM_FILE_ENCRYPTED|KPM_FILE_IMPLODE,0,FILE_TYPE_DATA); //KPM_AddFile(pArchive,"d:\\c.txt","c.txt",KPM_FILE_ENCRYPTED|KPM_FILE_IMPLODE,0,FILE_TYPE_DATA); //KPM_AddFile(pArchive,"d:\\旱地土地上层.rar","旱地土地上层.tga",KPM_FILE_REPLACEEXISTING,0,FILE_TYPE_DATA); //TKPMFile* pFile = KPM_FileOpen(pArchive,"d:\\c.txt",R); // //char * Buffer = new char[1024*1024]; //DWORD Read; //KPM_ReadFile(pFile,Buffer,1024*1024,&Read); //KPM_FileEof(pFile); // //KPM_FileClose(pFile); //KPM_CloseArchive(pArchive); // //pArchive =KPM_OpenArchive("d:\\a.mpq",R); ////KPM_AddFile(pArchive,"d:\\旱地土地上层.rar","旱地土地上层.tga",KPM_FILE_REPLACEEXISTING,0,FILE_TYPE_DATA); //KPM_RenameFile(pArchive,"旱地土地上层.tga","a.tga"); //pFile = KPM_FileOpen(pArchive,"a.tga",R); // // // //KPM_ReadFile(pFile,Buffer,1024*1024,&Read); //KPM_FileEof(pFile); //KPM_FileClose(pFile); // //FILE* f = fopen("d:\\d.rar","wb"); //fwrite(Buffer,Read,1,f); //fclose(f); ////KPM_RemoveFile(pArchive,"旱地土地上层.tga"); // //FILE_FIND_DATA sf; //BOOL bFound = TRUE; //TKPMSearch* hFind = KPM_FindFirstFile(pArchive,"*",&sf); //while(hFind != NULL && bFound != FALSE) //{ // bFound = KPM_FindNextFile(hFind,&sf); //} //KPM_SearchClose(hFind); // //KPM_CloseArchive(pArchive); // printf( "\n 处理完毕,按任意键退出!" ); int val = getchar(); val = getchar(); return 0; }