中级玩家
 
- 贡献度
- 17
- 金元
- 1174
- 积分
- 185
- 精华
- 0
- 注册时间
- 2008-7-22

|
//pak打包
BOOL CFilePak: opPak(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));
UINT dwReaded = 0;
BYTE* pData = new BYTE[102400];
if(pData == NULL)
{
f.Close();
return FALSE;
}
for(int j=0;j<m_FileList.size();j++)
{
CFile fr;
if(!fr.Open(m_FileList[j].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: opUnPak(const char* szPakFile, const char* szDestDir)
{
if(!gPakInterface->AddPakFile(szPakFile))
{
return FALSE;
}
std::string aDestDir = szDestDir;
if(aDestDir[aDestDir.size()] != '')
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;
} |
|