📄 compress.cpp
字号:
if(k < 0) break;
last=(word) k;
}
fwrite(&ii,2,1,out);
result=2.5*len_cp+len_af;
af_file+=result;
result=result/len_fi;
len_af=len_cp=0;
return 0;
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//decompress : 解压缩
//
int decompress(FILE *in,int type)
{
char* content; //解压完的缓存
unsigned char* len_date; //缩略的长度对照表 用af_index寻址。
content = (char*)malloc(65536*sizeof(char));
memset(content,0,sizeof(content));
len_date = (unsigned char*)malloc(65536*sizeof(unsigned char));
memset(len_date,0,sizeof(len_date));
unsigned short last,af_length,cp_length;
unsigned char tem,ah,al;
unsigned int a;
unsigned int b; //负责len_date中的寻址
unsigned int c; //缩略长度
unsigned int d; //
unsigned int address; //负责content中寻址。
FILE *out;
char filena[20]; //放文件名
unsigned char co_len=0; //密码长度
unsigned char fi_num; //文件个数
long fi_len=0; //文件长度
unsigned char fn_len=0; //文件名长度
int flag=1;
fread(&co_len,1,1,in);
fi_num=co_len;
for(;;)
{
fi_len=0; //文件长度
fn_len=0;
fread(&fn_len,1,1,in);
if(feof(in)) break;
fread(filena,fn_len,1,in);
if((out=fopen(filena,"wb")) == NULL)
{
MessageBox(NULL,_T("Can't open file!"),_T("Error"),MB_OK);
return 1;
}
fread(&fi_len,4,1,in);
al_se=no_se=0;
al_se=fi_len/16384+1;
while(1)
{
last=0;
af_length=0;
cp_length=0;
fread(&last,2,1,in);
if(last == 0) break;
fread(&af_length,2,1,in);
fread(&cp_length,2,1,in);
if(al_se-no_se >= 4)
len_se=last/4+3;
else
len_se=last/(al_se-no_se)+2;
for(a=0;;)
{
if(cp_length == 0) break;
fread(&tem,1,1,in);
len_date[a]=tem/16;
a++;
if(a == cp_length) break;
len_date[a]=tem%16;
a++;
if(a == cp_length) break;
}
for(a=b=0;a<last;)
{
fread(&tem,1,1,in);
if(tem != 255) {content[a]=tem;a++;}
else
{
if(len_date[b] == 0) {content[a]=tem;a++;}
else
{
if(len_date[b] == 1)
{
MessageBox(NULL,_T("Decompress Error!"),_T("Error"),MB_OK);
exit(0);
}
c=len_date[b]+2;
fread(&ah,1,1,in);
fread(&al,1,1,in);
address=ah*256+al;
for(d=0;d<c;d++,a++)
content[a]=content[address+d];
}
b++; //对照一次指针移动一次
}
}
fwrite(content,1,last,out);
}
fclose(out);
}
return 0;
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//umain:用于解压缩的引导
//返回:0 成功,1 失败
int umain(char* path)
{
FILE *in;
if((in=fopen(path,"rb")) == NULL)
{
MessageBox(NULL,_T("Can't open the source file!"),_T("Error"),MB_OK);
return 1;
}
int result=0;
result = decompress(in,2);
return result;
}
////////////////////////////////////////////////////////////////////
//comain:引导压缩。接受待压文件名,分配压缩。压缩成默认的czf格式
//allpath:存放待压文件全路径名,name存放文件名
//返回:0 成功,1 失败
int comain(char name[100][50],char allpath[100][100],int itemCount,char* savePath)
{
int i=0;
int kk; //个文件名长度
FILE *in;
FILE *out;
int result=0;
double rate=0;
if((out=fopen(savePath,"wb")) == NULL)
{
MessageBox(NULL,_T("Can't create cz file!"),_T("Error"),MB_OK);
return 1;
}
fwrite(&itemCount,1,1,out);
for(i=0;i<itemCount;i++)
{
if((in=fopen(allpath[i],"rb")) == NULL)
{MessageBox(NULL,_T("Can't open source file!"),_T("Error"),MB_OK);;return 1;}
kk=strlen(name[i]);
kk++;
fwrite(&kk,1,1,out);
fwrite(name[i],kk,1,out);
result = compress(in,out,2);
fclose(in);
}
fclose(out);
if(result == 0)
{
rate=1-(af_file/a_file);
char buf[100];
TCHAR buf2[100];
sprintf(buf,"Source file(s) total:\t %.0f\n Czf file :\t %.0f\n rate: %.2f%% \n",a_file,af_file,rate*100);
MultiByteToWideChar(CP_ACP,NULL,buf,-1,buf2,sizeof(buf2));
MessageBox(NULL,buf2,_T("OK"),MB_OK);
}
return result;
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//comain:引导压缩。接受待压文件名,分配压缩。压缩成能自解压的exe格式
//allpath:存放待压文件全路径名,name存放文件名
//返回:0 成功,1 失败
int comain2(char name[100][50],char allpath[100][100],int itemCount,char* savePath)
{
int i=0;
char file1[100];
int kk; //个文件名长度
FILE *in;
FILE *out;
int fn_len=0;
int AllNameLen=0;
char file4[5]={'.','e','x','e','\0'};
TCHAR WideName[100];
int result = 0;
AllNameLen = strlen(savePath);
savePath[AllNameLen-4]=0;
strcat(savePath,file4);
MultiByteToWideChar(CP_ACP,NULL,savePath,-1,WideName,sizeof(WideName));
CopyFile(_T("auto.exe"),WideName,false);
if((out=fopen(savePath,"rb+")) == NULL)
{
MessageBox(NULL,_T("Can't create exe file!"),_T("Error"),MB_OK);
return 1;
}
for(i=AllNameLen-4;i>=-1;i--)
{
if(savePath[i] == '\\') break;
}
if(i<0) i=0;
strcpy(file1,savePath+i+1);
fn_len = strlen(file1);
fn_len++;
fseek(out,8260,0);
fwrite(file1,fn_len,1,out);
fclose(out);
if((out=fopen(savePath,"ab")) == NULL)
{
MessageBox(NULL,_T("Can't create exe file!"),_T("Error"),MB_OK);
return 1;
}
fwrite(&itemCount,1,1,out);
for(i=0;i<itemCount;i++)
{
if((in=fopen(allpath[i],"rb")) == NULL)
{MessageBox(NULL,_T("Can't open source file!"),_T("Error"),MB_OK);;return 1;}
kk=strlen(name[i]);
kk++;
fwrite(&kk,1,1,out);
fwrite(name[i],kk,1,out);
result = compress(in,out,2);
fclose(in);
}
fclose(out);
if(result == 0)
{
double rate=1-(af_file/a_file);
char buf[100];
TCHAR buf2[100];
sprintf(buf,"Source file(s) total:\t %.0f\n Exe file :\t %.0f\n rate: %.2f%% \n",a_file,af_file,rate*100);
MultiByteToWideChar(CP_ACP,NULL,buf,-1,buf2,sizeof(buf2));
MessageBox(NULL,buf2,_T("OK"),MB_OK);
}
return result;
}
////////////////////////////////////////////////////////////////////
//CPList:读取czf格式文件中的压缩文件信息
//length:存放文件长度,name存放文件名
//返回:文件个数
int CPList(char target[50],char name[100][50],long length[100])
{
int num=0;//文件个数
int i;
int kk=0; //文件名长度
int last=0,af_length=0,cp_length=0;
FILE* in=fopen(target,"rb");
fread(&num,1,1,in);
for(i=0;i<num;i++)
{
fread(&kk,1,1,in);
fread(name[i],kk,1,in);
fread(&length[i],4,1,in);
{
int ii;
long tem;
while(1)
{
fread(&last,2,1,in);
if(last == 0) break;
fread(&af_length,2,1,in);
fread(&cp_length,2,1,in);
ii=cp_length/2;
if(cp_length%2 != 0)
ii++;
tem = ii+af_length;
fseek(in,tem,SEEK_CUR);
}
}
}
return num;
}
////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -