📄 flypakutil.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 + -