📄 gpacker.cpp
字号:
#include"GPacker.h"
#include<windows.h>
#include<fstream>
#include<algorithm>
#include<assert.h>
#pragma warning(disable:4786)
using namespace std;
GBinarySearchPacker::GBinarySearchPacker()
{
}
GBinarySearchPacker::~GBinarySearchPacker()
{
ClosePackFile();
}
bool GBinarySearchPacker::ReadPackedFile(const string &strFile,GFileData & fd)
{
if(!m_ifs.is_open())
return false;
unsigned long index=SearchFileIndex(strFile);
if(0xffffffff==index)
return false;
if(m_vAllFileAttrib[index].dwAttrib!=FILE_ATTRIBUTE_NORMAL)
return false;
unsigned long dwByteRead=m_vAllFileAttrib[index].dwLength;
m_ifs.seekg(m_vAllFileAttrib[index].dwOffsite,ios::beg);
fd.AllocMemory(dwByteRead);
if(!fd.GetData())
return false;
m_ifs.read(fd.GetData(),dwByteRead);
return true;
}
bool GBinarySearchPacker::ReadPackedFile(const string &strFile,char**ppReturnData,unsigned long & dwByteRead)
{
assert(ppReturnData);
if(!m_ifs.is_open())
return false;
unsigned long index=SearchFileIndex(strFile);
if(0xffffffff==index)
return false;
if(m_vAllFileAttrib[index].dwAttrib!=FILE_ATTRIBUTE_NORMAL)
return false;
dwByteRead=m_vAllFileAttrib[index].dwLength;
m_ifs.seekg(m_vAllFileAttrib[index].dwOffsite,ios::beg);
(*ppReturnData)=new char[dwByteRead];
if(!(*ppReturnData))
return false;
m_ifs.read((*ppReturnData),dwByteRead);
return true;
}
bool GBinarySearchPacker::ClosePackFile()
{
if(m_ifs.is_open())
m_ifs.close();
m_vAllFileAttrib.clear();
return true;
}
unsigned long GBinarySearchPacker::SearchFileIndex(const string & data)
{
char str[128];
strncpy(str,data.data(),128);
strlwr(str);
string strForCmp=str;
int mid=(m_vAllFileAttrib.size()-1)>>1;
int i=0,j=m_vAllFileAttrib.size()-1;
while(i<=j)
{
if(m_vAllFileAttrib[mid].m_strFileName<strForCmp)
{
i=mid+1;
mid=(i+j)>>1;
}
else if(m_vAllFileAttrib[mid].m_strFileName>strForCmp)
{
j=mid-1;
mid=(i+j)>>1;
}
else
return mid;
}
return 0xffffffff;
}
bool GBinarySearchPacker::GetPackerFileName(ifstream & ifs,const STPackerFile & pfObject)
{
if(FILE_ATTRIBUTE_DIRECTORY==pfObject.dwAttrib)
{
STFileAttrib fa;
fa.m_strFileName=pfObject.szFileName;
fa.stDirInfo.wDirCount=pfObject.stDirInfo.wDirCount;
fa.stDirInfo.wFileCount=pfObject.stDirInfo.wFileCount;
fa.dwOffsite=pfObject.dwOffsite;
fa.dwAttrib=FILE_ATTRIBUTE_DIRECTORY;
m_vAllFileAttrib.push_back(fa);
vector<STPackerFile> vFile;
for(unsigned long i=0;i<pfObject.stDirInfo.wFileCount;i++)
{
STPackerFile pf;
ifs.read((char*)&pf,sizeof(pf));
vFile.push_back(pf);
}
for(i=0;i<vFile.size();i++)
{
GetPackerFileName(ifs,vFile[i]);
}
for(i=0;i<pfObject.stDirInfo.wDirCount;i++)
{
STPackerFile pf;
ifs.read((char*)&pf,sizeof(pf));
GetPackerFileName(ifs,pf);
}
}
else
{
ifs.seekg(pfObject.dwLength,ios::cur);
STFileAttrib fa;
fa.m_strFileName=pfObject.szFileName;
fa.dwLength=pfObject.dwLength;
fa.dwOffsite=pfObject.dwOffsite;
fa.dwAttrib=FILE_ATTRIBUTE_NORMAL;
m_vAllFileAttrib.push_back(fa);
}
return true;
}
bool GBinarySearchPacker::CompareFileAttrib(const STFileAttrib & fa1,const STFileAttrib & fa2)
{
return fa1.m_strFileName<=fa2.m_strFileName?true:false;
}
bool GBinarySearchPacker::OpenPackFile(const string & strFile)
{
ClosePackFile();
m_ifs.open(strFile.data(),ios::in|ios::binary);
if(!m_ifs.is_open())
return false;
STPackFileHeader pfh;
m_ifs.read((char*)&pfh,sizeof(pfh));
if(C_BSP_FILE_ID!=pfh.dwID)
{
return false;
}
m_dwPackerDirCount=pfh.dwDirCount;
m_dwPackerFileCount=pfh.dwFileCount;
STPackerFile pfDir;
m_ifs.read((char*)&pfDir,sizeof(pfDir));
if(GetPackerFileName(m_ifs,pfDir))
{
sort(m_vAllFileAttrib.begin(),m_vAllFileAttrib.end(),CompareFileAttrib);
return true;
}
else
{
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -