cnwangming 发表于 2010-3-27 21:25

植物大战僵尸pak文件打、解包代码 (看到有人求,就发出来了)

//pak打包
BOOL CFilePak::PopPak(const char* szPakFile, const char* szSrcDir)
{
      if(!GetFileList(szSrcDir))
                return FALSE;
      
      CFile f;
      if(!f.Open(szPakFile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
                return FALSE;

      DWORD dwMagic = 0xBAC04AC0;
      DWORD dwVersion = 0x0;

      Write(&f,&dwMagic,sizeof(dwMagic));
      Write(&f,&dwVersion,sizeof(dwVersion));

      int abc = m_FileList.size();
      for(int i=0;i<m_FileList.size();i++)
      {
                BYTE   uFlags;                //0x0代表正常 0x80(FILEFLAGS_END)代表文件尾
                BYTE   uNameWidth;      //文件名长度
                char*    Name;                        //文件名
                int      SrcSize;                //文件大小
                FILETIME ftFileTime;      //文件时间

                uFlags = 0x0;
                uNameWidth = strlen(m_FileList.szFileName) - strlen(szSrcDir) - 1;
                SrcSize = m_FileList.dwFileSize;
                Name = m_FileList.szFileName;
                Name += strlen(szSrcDir)+1;
                memcpy(&ftFileTime,&m_FileList.ftFileTime,sizeof(ftFileTime));

                Write(&f,&uFlags,sizeof(uFlags));
                Write(&f,&uNameWidth,sizeof(uNameWidth));
                Write(&f,Name,strlen(Name));
                Write(&f,&SrcSize,sizeof(SrcSize));
                Write(&f,&ftFileTime,sizeof(ftFileTime));
      }
      BYTE uFlags = 0x80;                        //FILEFLAGS_END代表数据结构结尾后边跟的就都是正常的文件数据
      Write(&f,&uFlags,sizeof(uFlags));

      UINTdwReaded = 0;
      BYTE* pData = new BYTE;
      if(pData == NULL)
      {
                f.Close();
                return FALSE;
      }
      
      for(int j=0;j<m_FileList.size();j++)
      {
                CFile fr;
                if(!fr.Open(m_FileList.szFileName,CFile::modeRead|CFile::typeBinary))
                        continue;
               
                while(dwReaded = fr.Read(pData,102400))
                {
                        Write(&f,pData,dwReaded);
                }
                fr.Close();
      }
      delete pData;
      f.Close();

      return TRUE;
}

//pak解包
BOOL CFilePak::PopUnPak(const char* szPakFile, const char* szDestDir)
{
      if(!gPakInterface->AddPakFile(szPakFile))
      {
                return FALSE;
      }
      
      std::string aDestDir = szDestDir;
      if(aDestDir != '')
                aDestDir += "";

      if(aDestDir != "")
                MkDir(aDestDir);
      
      PakRecordMap::iterator map_itr = gPakInterface->mPakRecordMap.begin();
      for( ; map_itr != gPakInterface->mPakRecordMap.end(); map_itr++)
      {
                if(Upper(map_itr->second.mFileName) == Upper(szPakFile))
                        continue;
               
                std::string aFileDest = aDestDir + map_itr->second.mFileName;
                MkDir(GetFileDir(aFileDest,false));
               
                FILE* anOutputFile = fopen(aFileDest.c_str(), "wb");
                if(anOutputFile)
                {
                        PFILE aPFP;
                        aPFP.mRecord = &map_itr->second;
                        aPFP.mPos = 0;
                        aPFP.mFP = NULL;
                        
                        BYTE aReadByte;
                        while(aPFP.mPos < map_itr->second.mSize && gPakInterface->FRead(&aReadByte, 1,1, &aPFP))
                        {
                              fwrite(&aReadByte, 1, 1, anOutputFile);
                        }
                        
                        fclose(anOutputFile);
                }
      }

      return TRUE;
}
页: [1]
查看完整版本: 植物大战僵尸pak文件打、解包代码 (看到有人求,就发出来了)