|
|
BOOL AddDataToPackFile( CStrClass pakname, CStrClass dir )
{
I4DyuchiFileStorage* pFS;
g_pExecutive->GetFileStorage(&pFS);
void* pPakFile = pFS->MapPackFile((char*)(LPCTSTR)pakname);
if(pPakFile == NULL)
return FALSE;
BOOL rt = pFS->LockPackFile(pPakFile,0);
if(rt == FALSE)
return FALSE;
char CurDir[MAX_PATH];
GetCurrentDirectory(MAX_PATH,CurDir);
BOOL bSD = SetCurrentDirectory(dir);
CDirectoryName dirname(NULL,NULL);
dirname.LoadChild();
SetCurrentDirectory(CurDir);
dirname.SetPositionHead();
DWORD kind;
CStrClass filename;
CStrClass tname;
while((kind=dirname.GetNextFileName(&filename)) != GETNEXTFILENAME_END)
{
if(kind != GETNEXTFILENAME_FILE)
continue;
if(filename == "")
continue;
tname = dir + "\\" + filename;
if(pFS->InsertFileToPackFile(pPakFile,(char*)(LPCTSTR)tname) == FALSE)
return FALSE;
}
BOOL unlock = pFS->UnlockPackFile(pPakFile,PackingCallBackFunc);
if(unlock == FALSE)
return FALSE;
pFS->UnmapPackFile(pPakFile);
pFS->Release();
return TRUE;
}
void CAutoPatchDlg: ack3DData(void* p)
{
CDirectoryName dirname(NULL,NULL);
DWORD kind;
CStrClass filename;
CStrClass pakname,tname;
BOOL bSuccess = TRUE;
HWND hDlg = (HWND)p;
char CurDir[MAX_PATH];
CStrClass datafolder = "3DData\\";
GetCurrentDirectory(MAX_PATH,CurDir);
BOOL bSD = SetCurrentDirectory("3ddata");
if(bSD == FALSE)
{
bSuccess = TRUE;
goto packend;
}
dirname.LoadChild();
SetCurrentDirectory(CurDir);
if( InitEngine() == FALSE )
{
bSuccess = FALSE;
goto packend;
}
dirname.SetPositionHead();
while((kind=dirname.GetNextFileName(&filename)) != GETNEXTFILENAME_END)
{
if(kind != GETNEXTFILENAME_DIRECTORY)
continue;
if(filename == "")
continue;
if(filename.Right(1) == "\\")
filename = filename.Left(filename.GetLength()-1);
pakname = filename + ".pak";
tname = datafolder + filename;
if(AddDataToPackFile(pakname,tname) == FALSE)
{
bSuccess = FALSE;
goto packend;
}
}
dirname.SetPositionHead();
while((kind=dirname.GetNextFileName(&filename)) != GETNEXTFILENAME_END)
{
if(kind != GETNEXTFILENAME_FILE)
continue;
if(filename == "")
continue;
tname = datafolder + filename;
BOOL rt = DeleteFile(tname);
}
dirname.SetPositionHead();
while((kind=dirname.GetNextFileName(&filename)) != GETNEXTFILENAME_END)
{
if(kind != GETNEXTFILENAME_DIRECTORY)
continue;
tname = datafolder + filename;
RemoveDirectory(tname);
}
RemoveDirectory(datafolder);
packend:
if( bSuccess )
::SendMessage( m_sHWnd, WM_RUNPROGRAM, 0, 0 );
else
::SendMessage( m_sHWnd, WM_RUNPROGRAM, 0, 0 );
return;
}
DWORD __stdcall PackingCallBackFunc( DWORD dwCurCount,DWORD dwTotalCount,void* pArg )
{
DWORD PackingProcess = (PRO_RANGE_EX*dwCurCount) / dwTotalCount;
#ifdef _FOR_CLIENT_
CMHAutoPatchDlg* pMainDlg = (CMHAutoPatchDlg*)AfxGetMainWnd();
CSkinProgressBar* pBar = pMainDlg->GetProgressBar();
pBar->SetPos( PackingProcess );
#endif
return 0;
}
这段代码有点难懂,想请教下..
还有如何从pak读取文件呢?? 怎么实现
[em13] [em13] |
|