c++builder ZIP文件解压与压缩(ZLIB DLL调用),目录复制与删除整合的自用类,可自行扩张!

原创 2012年03月31日 10:24:30

头文件:ZipAndFile.h

//---------------------------------------------------------------------------

#ifndef ZipAndFileH
#define ZipAndFileH
#include <Classes.hpp>
//---------------------------------------------------------------------------
class ZipAndFile{
	private:

	public:
	ZipAndFile();
	~ZipAndFile();
	//ZIP操作
	bool DoZipfile(String DoZip,String ZipFilename,String SourceFile,bool Check);
	//复制目录
	bool MyCopyFiles(AnsiString FromFile,AnsiString ToFile);
	//删除目录
	bool deldir(char* dir_fullpath);
	};
#endif


源文件:ZipAndFile.cpp

//---------------------------------------------------------------------------
#pragma hdrstop
#include "ZipAndFile.h"
#include "Tlhelp32.h"
#include <vcl.h>

//---------------------------------------------------------------------------
ZipAndFile::ZipAndFile()
{
}
ZipAndFile::~ZipAndFile()
{
}
//ZIP压缩与解压
//---------------------------------------------------------------------------
bool ZipAndFile::DoZipfile(String DoZip,String ZipFilename,String SourceFile,bool Check)
{
	bool ZipReturn=false;
	WideString w1;//必需要这样申请WideString变量,不然传值时会让两个变量使用同一样内存地址,搞了3个小时才发现这是BCB2006的BUG.
	WideString w2;
	LPCTSTR L1;//必需使用这个格式的变量,不然传过去到DLL时乱码。  
	LPCTSTR L2;
	if(DoZip=="ZWZipCompress")//压缩
	{
		w1=SourceFile; 
		w2=ZipFilename;
		L1=(const char*)w1.c_bstr();
		L2=(const char*)w2.c_bstr();
		bool __stdcall (*DllMethods)(LPCTSTR,LPCTSTR,bool);
		HINSTANCE hInst=NULL;
		hInst=LoadLibrary((ExtractFilePath(Application->ExeName)+"ZLibWrap.dll").c_str());//动态加载DLL  //当前目录下的DLL文件  
		FARPROC P;
		P = GetProcAddress(hInst,DoZip.c_str());
		DllMethods=(bool __stdcall (__cdecl *)(LPCTSTR,LPCTSTR,bool))P;
		if(DllMethods){
			ZipReturn=DllMethods(L1,L2,Check);
		}
		FreeLibrary(hInst);
		return ZipReturn;
	}else if(DoZip=="ZWZipExtract")//解压 
	{
		w1=ZipFilename;
		w2=SourceFile;
		L1=(const char*)w1.c_bstr();
		L2=(const char*)w2.c_bstr();
		bool __stdcall (*DllMethods)(LPCTSTR,LPCTSTR);
		HINSTANCE hInst=NULL;
		hInst=LoadLibrary((ExtractFilePath(Application->ExeName)+"ZLibWrap.dll").c_str());//动态加载DLL  //当前目录下的DLL文件  
		FARPROC P;
		P = GetProcAddress(hInst,DoZip.c_str());
		DllMethods=(bool __stdcall (__cdecl *)(LPCTSTR,LPCTSTR))P;
		if(DllMethods){
			ZipReturn=DllMethods(L1,L2);
		}
		FreeLibrary(hInst);
		return ZipReturn;
	}
}
//复制目录文件
//---------------------------------------------------------------------------
bool ZipAndFile::MyCopyFiles(AnsiString FromFile,AnsiString ToFile)
{
	while(true){
		if (!DirectoryExists(ToFile)){
			CreateDir(ToFile);//文件夹不存在则创建
			break;
		}else{
			deldir(ToFile.c_str());//在就删除
		}
    }
	SHFILEOPSTRUCT op;
	String strFrom = FromFile+"\\*.*";
	String strTo = ToFile;
	op.fAnyOperationsAborted = true;
	op.hwnd = NULL;
	op.wFunc = FO_COPY;
	op.pFrom = strFrom.c_str();
	op.pTo = strTo.c_str();
	op.fFlags = FOF_NOCONFIRMATION |FOF_NOCONFIRMMKDIR; //FOF_NOCONFIRMATION 不出现确认对话框(当需要覆盖时)
	bool b=false;
	b=SHFileOperation(&op);
	//int kkk= SHFileOperation(&op);
	switch(GetLastError())
	{
		//只要出错就弹出
		return false;
	}

	return(b);
}
//删除目录文件
//---------------------------------------------------------------------------
bool ZipAndFile::deldir(char* dir_fullpath)	 //删除指定的目录
{ 
	char dir[260]={0};
	char filename[260]={0};
	int len = 0;
	int	ch = '\\';
	strcpy(dir, dir_fullpath);
	len = strlen(dir);
	char *temp = strrchr(dir,ch);//查找\\
	if(len < 4 || temp == NULL)	 //根据后面的\\来判断,可能为磁盘根目录或者不是有效的目录路径
	return false;
	
	if(temp != NULL)
	{ 
		if((temp - dir + 1) != len)	 //在目录后添加 '\\'
		strcat(dir,"\\");
	}
	GetCurrentDirectory(260,filename);//得到当前目录
	strcat(filename,"\\");
	if(strcmp(dir,filename)==0)	//如果要删除的目录是当前目录
	{ 
		strcat(filename,"..");
		SetCurrentDirectory(filename);	//改变当前目录
	}

	WIN32_FIND_DATA finddata;
	HANDLE fFile;
	bool flag;
	strcpy(filename,dir);
	strcat(filename,"*.*");
	fFile=FindFirstFile(filename,&finddata);
	flag=true;
	if(fFile!=INVALID_HANDLE_VALUE)	 //此目录有没有效
	{
		BOOL bfind=true;
		while(bfind)
		{
			if(finddata.cFileName[0] != '.')
			{
				strcpy(filename,dir);
				strcat(filename,finddata.cFileName);
				if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//判断是不是文件夹
				{	//删除找到的子目录
					strcat(filename,"\\");//如果文件夹就再加上\\后进行递归
					flag = flag && deldir(filename); //递归
				}
				else
				{	//删除找到的文件
					SetFileAttributes(filename,FILE_ATTRIBUTE_NORMAL);//文件属性设为普通
					flag = flag && DeleteFile(filename); //删除
				}
			}
		bfind = FindNextFile(fFile,&finddata);
		}
		FindClose(fFile);
	}
	if(flag)
	{
		SetFileAttributes(dir_fullpath,FILE_ATTRIBUTE_NORMAL);//去掉只读
		if(RemoveDirectory(dir_fullpath))//删除空目录
		return   true;
	}
	return   false;
}



使用方法:包了头文件后:

ZipAndFile *TZipAndFile=new ZipAndFile();//新建对像
//删除temp文件夹
		dir_fullpath=(ExePath+"web_back").c_str();//删除web原文件
		if(TZipAndFile->deldir(dir_fullpath)) {}
delete TZipAndFile;// 删除对像



DLL下载地址:

DLL文件下载

http://download.csdn.net/detail/goodai007/4182207

DLL两个接口:

//压缩,bUtf8为false将支持路径与文件内包含中文

BOOL ZWZipCompress(LPCTSTR lpszSourceFiles, LPCTSTR lpszDestFile, bool bUtf8 = false);

//解压
BOOL ZWZipExtract(LPCTSTR lpszSourceFile, LPCTSTR lpszDestFolder);


版权声明:本文为博主原创文章,未经博主允许不得转载。

在C++BUILDER中应用ZLIB

#include          void   __fastcall   TFrmMain::BtnCompressClick(TObject   *Sender)     //   压缩     ...

Delphi使用Zlib、C++Builder使用Zlib

2010-10-06 修正解压缩代码uses zlib;//将Src使用Zlib压缩后存入Dst当中 procedure PackStream(const Src:TStream; Dst:TStr...

zipfile的压缩和解压缩

zipfile是python提供的内置的压缩方法 可以对zip文件进行压缩和解压缩 压缩:  zf = ZipFile("out.zip", "w", mode=zipfile.ZIP_STOR...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++ Builder压缩、解压缩文件

在C++ Builder里压缩、解压缩文件的例子

使用ZLIB生成DLL文件,并进行有中文的ZIP文件压缩与解压操作!支持目录压与解!

借鉴ZLibWrap.DLL进行二次加工生成DLL文件,在C++builder中进行动态调用DLL,压缩与解压标准ZIP文件操作! 因为有中文操作需要多出一个参数,所以要使用两份,本来准备写类,用构...

ARM-CortexM4指令列表

ARM Cortex-M4 指令列表16 位数据操作指令 指令 功能 ADC 带进位加法 ADD 加法 AND 按...

使用 ZLib 压缩/解压 ZIP 文件

实际应用中有时候会遇到需要处理 ZIP 压缩解压的情况,这时候我们有大概三种选择: 调用 rar.exe, unzip.exe 等使用某现成库完全手写 第一种虽然能完成任务,但是没法知晓结...
  • wishfly
  • wishfly
  • 2015年06月05日 15:02
  • 787

使用 ZLib 压缩/解压 ZIP 文件

zlib

使用 ZLib 压缩/解压 ZIP 文件

实际应用中有时候会遇到需要处理 ZIP 压缩解压的情况,这时候我们有大概三种选择: 调用 rar.exe, unzip.exe 等 使用某现成库 完全手写 第一种虽然能完成任务,但是没法知晓结...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++builder ZIP文件解压与压缩(ZLIB DLL调用),目录复制与删除整合的自用类,可自行扩张!
举报原因:
原因补充:

(最多只允许输入30个字)