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