⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpacker.cpp

📁 用FREE BASIC做的演示程序
💻 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 + -