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

📄 flypakutil.cpp

📁 <B>《Realtime Rendering》的随书源代码
💻 CPP
字号:
#include "../Fly3D.h"
#include <direct.h>

bool fly_pak_util::implode(char *foldername)
{
	char *str;
	bool rslt;

	strcpy(folder, foldername);

	str=new char[strlen(foldername)+5];

	strcpy(str, foldername);
	strcat(str,".fpk");
	
	fpk=fopen(str, "wb");

	delete str;
	
	if(!fpk)
		return false;

	filelist=(struct fileinfo *)malloc(0);
	lenfilelist=0;

	totalsize=0;
	currsize=0;

	rslt=browse(foldername);

	if(rslt) rslt=add_header();
	if(rslt) rslt=add_data();

	fclose(fpk);

	free(filelist);
	
	return rslt;
}

bool fly_pak_util::browse(char *foldername)
{
	HANDLE hFindFile;
	WIN32_FIND_DATA FindFileData;
	char *str;
	bool rslt;

	str=new char[strlen(foldername)+3];

	strcpy(str, foldername);
	strcat(str, "\\*");

	hFindFile=FindFirstFile(str, &FindFileData);

	delete str;

	if(hFindFile==INVALID_HANDLE_VALUE)
		return false;

	rslt=true;

	do
	{
		if(0==strcmp(FindFileData.cFileName, ".") ||
		   0==strcmp(FindFileData.cFileName, ".."))
			continue;

		str=new char[strlen(foldername)+strlen(FindFileData.cFileName)+2];

		strcpy(str, foldername);
		strcat(str, "\\");
		strcat(str, FindFileData.cFileName);

		if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			rslt=browse(str);
		else
			add_filelist(str, (FindFileData.nFileSizeHigh * MAXDWORD) + FindFileData.nFileSizeLow);

		delete str;
	}
	while(rslt && FindNextFile(hFindFile, &FindFileData));

	FindClose(hFindFile);

	return rslt;
}

bool fly_pak_util::add(int i)
{
	FILE *f;
	char fb[MAXP];
	bool rslt;
	char bl[10240];
	unsigned long curread;

	strcpy(fb, folder);
	strcat(fb, "\\");
	strcat(fb, filelist[i].filename);

	if(!(f=fopen(fb,"rb")))
		return false;

	rslt=true;

	while(rslt && (curread=fread(bl, 1, 10240, f)) )
		if((rslt=(fwrite(bl, 1, curread, fpk)==curread)))
			currsize+=curread;

	fclose(f);

	return rslt;
}

bool fly_pak_util::explode(char *filename)
{
	unsigned int i;
	char str[MAXP], *p;

	if(!(fpk=fopen(filename,"rb")))
		return false;

	while(p=strrchr(filename, '/')) *p='\\';

	if(p=strstr(filename, ".fpk"))
		*p=0;
	else
	{
		fclose(fpk);
		return false;
	}

	fread(&lenfilelist, sizeof(unsigned int), 1, fpk);

	if(lenfilelist==0)
	{
		fclose(fpk);
		return true;
	}

	filelist=new fileinfo[lenfilelist];

	fread(filelist, sizeof(struct fileinfo), lenfilelist, fpk);

	currsize=0;
	totalsize=0;

	for(i=0; i<lenfilelist; i++)
		totalsize+=filelist[i].size;

	fseek(fpk, sizeof(unsigned int)+lenfilelist*sizeof(struct fileinfo), SEEK_SET);

	for(i=0; i<lenfilelist; i++)
	{
		create_dir(filename, filelist[i].filename);
		strcpy(str, filename);
		strcat(str, "\\");
		strcat(str, filelist[i].filename);
		if(!extract(str, filelist[i].size))
			break;

		update_status(filelist[i].filename, filelist[i].size);
	}

	fclose(fpk);
	
	return i==lenfilelist;
}

bool fly_pak_util::extract(char *filename, unsigned long size)
{
	FILE *fp;
	char bl[10240];
	unsigned long curread, curfile=0;
	unsigned long curb;
	
	if(!(fp=fopen(filename, "wb")))
		return false;

	while(curfile<size)
	{
		if(10240+curfile>size)
			curb=size-curfile;
		else
			curb=10240;

		if((curread=fread(bl, 1, curb, fpk)) && (fwrite(bl, 1, curread, fp)==curread))
		{
			curfile+=curread;
			currsize+=curread;
//			if(totalsize==0)
//				update_status(100);
//			else
//				update_status((int)((100.0*currsize)/totalsize));
		}
		else
			break;
	}

	fclose(fp);

	return curfile==size;
}

void fly_pak_util::create_dir(char *basefolder, char *filename)
{
	char *p=filename;
	char str[MAXP];

	_mkdir(basefolder);
	while(p=strchr(p+1, '\\'))
	{
		*p='\0';
		strcpy(str, basefolder);
		strcat(str, "\\");
		strcat(str, filename);
		_mkdir(str);
		*p='\\';
	}
}

void fly_pak_util::add_filelist(char *filename, unsigned long size)
{
	filelist=(struct fileinfo *)realloc(filelist, (++lenfilelist)*sizeof(struct fileinfo));

	strcpy(filelist[lenfilelist-1].filename, &filename[strlen(folder)+1]);
	filelist[lenfilelist-1].size=size;

	totalsize+=size;
}

bool fly_pak_util::add_header()
{
	if(fwrite(&lenfilelist, sizeof(unsigned int), 1, fpk)!=1)
		return false;

	if(fwrite(filelist, sizeof(struct fileinfo), lenfilelist, fpk)!=lenfilelist)
		return false;

	return true;
}

bool fly_pak_util::add_data()
{
	unsigned int i;

	for(i=0; i<lenfilelist; i++)
	{
		if(!add(i))
			break;
		
		update_status(filelist[i].filename, filelist[i].size);
	}

	return i==lenfilelist;
}

void fly_pak_util::update_status(char *filename, unsigned long size)
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -