游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1254|回复: 1

求助关于pak的一段代码

[复制链接]

23

主题

39

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2009-2-24 15:44:00 | 显示全部楼层 |阅读模式
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]

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-2-26 12:42:00 | 显示全部楼层

Re:求助关于pak的一段代码

要是能有工具打开就好了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 06:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表