C++ zlib 压缩解压文件

  对C++不是很熟悉,所以有些代码比较冗余,知道流程就行。

 

  

 

   选择需要压缩的文件按钮的代码

  

void CzlibdemoDlg::OnBnClickedSel()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框

	if(dlg.DoModal()==IDOK)
	{
		FilePathName=dlg.GetPathName();//获取压缩文件路径
	} 
}


   压缩按钮代码

 

void CzlibdemoDlg::OnBnClickedComp()
{
	// TODO: 在此添加控件通知处理程序代码
	// TODO: 在此添加控件通知处理程序代码
	FILE* file_src;
	FILE* file_dest;

	CString strpathname,strfilename,strtempfilename,strtempname,strtemppath,strnamegz,strxie;

	strxie = "\\";

	strnamegz = ".gz";

	ifstream fin;

	ofstream fwr;

	int errComp,file_len,file_len_src;
	unsigned long len_src;
	unsigned long len_tmp;

	if(FilePathName == "")
	{
		AfxMessageBox(_T("请选择需要压缩的文件"));
		return;
	}

	fin.open(FilePathName, ios_base::in | ios_base::binary); 

	fin.seekg(0,ios::end);

	file_len_src = fin.tellg();//获取原文件大小

	unsigned char* buffer_src = new unsigned char[file_len_src];
	unsigned char* buffer_tmp = new unsigned char[file_len_src];

	fin.seekg(0,ios::beg);

	fin.read((char *)buffer_src,file_len_src);//读取压缩文件内容

	errComp = compress(buffer_tmp,&len_tmp,(unsigned char *)buffer_src,file_len_src);//压缩

	if(errComp == 0)
	{
		AfxMessageBox(_T("压缩成功!"));
	}
	else
	{
		AfxMessageBox(_T("压缩失败!"));
	}

	strtempname = FilePathName.Mid(FilePathName.ReverseFind('\\') + 1);

	strtemppath = FilePathName.Left(FilePathName.ReverseFind('\\'));

	strtempfilename = strtempname.Left(strtempname.ReverseFind('.'));

	strfilename =strtemppath + strxie + strtempfilename + strnamegz;//截取修改需要保存的路径,如:C:\a.txt修改为C:\a.gz

	fwr.open(strfilename, ios_base::out | ios_base::binary); 


	unsigned char* buffer_src_tmp = new unsigned char[len_tmp + sizeof(file_len_src)];//在压缩文件前面写入4字节,用来保存原压缩文件长度
	memset(buffer_src_tmp, 0, len_tmp + sizeof(file_len_src));

	memcpy(buffer_src_tmp,&file_len_src,sizeof(file_len_src));

	memcpy(buffer_src_tmp + sizeof(file_len_src),(char *)buffer_tmp,len_tmp);

	fwr.write((char *)buffer_src_tmp,len_tmp + sizeof(file_len_src));//写入
	
	fin.close();
	fwr.close();

}


   选择需要解压的文件按钮的代码

 

void CzlibdemoDlg::OnBnClickedSel2()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框

	if(dlg.DoModal()==IDOK)
	{
		FilePathName=dlg.GetPathName();//获取解压文件路径
	} 

}


   解压按钮的代码

 

void CzlibdemoDlg::OnBnClickedUncomp()
{
	// TODO: 在此添加控件通知处理程序代码
	
	CString strpathname,strfilename,strtempfilename,strtempname,strtemppath,strnamegz,strxie;


	strxie = "\\";

	strnamegz = "_dest.txt";

	strtempname = FilePathName.Mid(FilePathName.ReverseFind('\\') + 1);

	strtemppath = FilePathName.Left(FilePathName.ReverseFind('\\'));

	strtempfilename = strtempname.Left(strtempname.ReverseFind('.'));

	strfilename =strtemppath + strxie + strtempfilename + strnamegz; //截取修改需要保存的路径,如:C:\a.gz修改为C:\a_dest.txt

	ifstream fin;//读取流

	ofstream fwr;//写入流

	unsigned long len_dest;
	int file_len,errComp,file_len_src,file_len_dest;

	unsigned char* buffer_len = new unsigned char[4];

	fin.open(FilePathName, ios_base::in | ios_base::binary); //打开文件

	fin.read((char *)buffer_len,sizeof(file_len_src));//读取流的前4个字节,此4字节为压缩原文件的大小

	file_len_src = *((int*)buffer_len);

	fin.seekg(4,ios::end);

	file_len_dest = fin.tellg();//获取4字节后压缩文件长度

	unsigned char* buffer_src = new unsigned char[file_len_src];
	unsigned char* buffer_dest = new unsigned char[file_len_dest];
	
	fin.seekg(4,ios::beg);//重新设置从4字节后开始读取

	fin.read((char *)buffer_dest,file_len_dest);//读取压缩文件内容

	errComp = uncompress(buffer_src,&len_dest,buffer_dest,file_len_dest);//解压

	if(errComp == 0)
	{
		AfxMessageBox(_T("解压成功!"));
	}
	else
	{
		AfxMessageBox(_T("解压失败!"));
	}

	fwr.open(strfilename, ios_base::out | ios_base::binary); 

	fwr.write((char *)buffer_src,len_dest);//将解压后的内容写入指定文件

	fin.close();
	fwr.close();
}


 

 

  

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值