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

📄 compress.cpp

📁 这是我自己写的wince程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -