对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(); }