65,186
社区成员




#include <string>
#include <vector>
#include <io.h>
struct FileIndex
{
DWORD dwOffset;
DWORD dwSize;
char szName[256];
};
BOOL MakePack(std::vector<std::string> arFileList, const std::string& strDestFile)
{
FILE* fp = fopen(strDestFile.c_str(), "wb");
if (!fp)
return FALSE;
DWORD dwSize = arFileList.size();
fwrite(&dwSize, 1, 4, fp);
FileIndex* pFileList = new FileIndex[arFileList.size()];
fwrite(pFileList, 1, arFileList.size() * sizeof(FileIndex), fp);
for (int i = 0; i < arFileList.size(); ++i)
{
strcpy(pFileList[i].szName, arFileList[i].c_str());
FILE* fbuf = fopen(arFileList[i].c_str(), "rb");
if (!fbuf)
{
fclose(fp);
delete pFileList;
return FALSE;
}
DWORD fsize = filelength(fileno(fbuf));
pFileList[i].dwSize = fsize;
pFileList[i].dwOffset = ftell(fp);
char* buf = new char[fsize];
fread(buf, 1, fsize, fbuf);
fclose(fbuf);
fwrite(buf, 1, fsize, fp);
delete buf;
}
fseek(fp, 4, SEEK_SET);
fwrite(pFileList, 1, arFileList.size() * sizeof(FileIndex), fp);
fclose(fp);
delete pFileList;
return TRUE;
}
FileIndex* OpenPack(const std::string& strPackFile)
{
FILE* fp =fopen(strPackFile.c_str(), "rb");
if (fp)
{
DWORD dwSize = 0;
fread(&dwSize, 1, 4, fp);
FileIndex* pFileIndex = new FileIndex[dwSize];
fread(pFileIndex, 1, dwSize * sizeof(FileIndex), fp);
fclose(fp);
return pFileIndex;
}
return NULL;
}
char* GetFile(const std::string& strPackFile, FileIndex* pFileIndex, const std::string& strFile)
{
FILE* fp =fopen(strPackFile.c_str(), "rb");
if (fp)
{
DWORD dwSize = 0;
fread(&dwSize, 1, 4, fp);
for (int i = 0; i < dwSize; ++i)
{
if (strFile == pFileIndex[i].szName)
{
char* buf = new char[pFileIndex[i].dwSize];
fseek(fp, pFileIndex[i].dwOffset, SEEK_SET);
fread(buf, 1, pFileIndex[i].dwSize, fp);
fclose(fp);
return buf;
}
}
fclose(fp);
}
return NULL;
}