Exemple #1
0
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
Exemple #2
0
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;
}