c++builder ZIP文件解压与压缩(ZLIB DLL调用)(转载 )
转载:http://blog.csdn.net/goodai007/article/details/7414512
头文件: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[]={};
char filename[]={};
int len = ;
int ch = '\\';
strcpy(dir, dir_fullpath);
len = strlen(dir);
char *temp = strrchr(dir,ch);//查找\\
if(len < || temp == NULL) //根据后面的\\来判断,可能为磁盘根目录或者不是有效的目录路径
return false; if(temp != NULL)
{
if((temp - dir + ) != len) //在目录后添加 '\\'
strcat(dir,"\\");
}
GetCurrentDirectory(,filename);//得到当前目录
strcat(filename,"\\");
if(strcmp(dir,filename)==) //如果要删除的目录是当前目录
{
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[] != '.')
{
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;// 删除对像
c++builder ZIP文件解压与压缩(ZLIB DLL调用)(转载 )的更多相关文章
- zip文件解压或压缩
<span style="font-size:18px;">/** * lsz */ public final class ZipUtil { /** * 解压zip文 ...
- ZIP文件解压
public class DZip { /// <summary> /// 压缩为ZIP文件 /// </summary> public void Zip(string dir ...
- linux下压缩成zip文件解压zip文件
linux zip命令的基本用法是: zip [参数] [打包后的文件名] [打包的目录路径] linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏 ...
- Linux:文件解压与压缩
文件打包与压缩 常见压缩文件格式: |文件后缀名 |说明| |.zip |zip程序打包压缩的文件| |.rar |rar程序压缩的文件| |.7z |7zip程序压缩的文件| |.tar |tar程 ...
- asp.net实现文件解压和压缩
C#解压RAR压缩文件(--转载--测试通过) using System; using System.Collections.Generic; using System.Text; using Sys ...
- Linux 下 zip 文件解压乱码解决方案,ubuntu16.10亲测可用
文章来源: https://www.zhihu.com/question/20523036 今天邮件中收到了一个压缩文件,解压后却是乱码,从网上也找了几个方法,目前这个方法还是比较可靠的,如下所示: ...
- Python实现加密的ZIP文件解压(密码已知)
博主在上篇博文介绍了<Python实现加密的RAR文件解压(密码已知)>后,又尝试了ZIP文件的解压方法,下面开始分享. 当ZIP文件的压缩密码已知时,可以通过调用zipfile库进行解压 ...
- linux .tar.xz 文件解压和压缩
场景:centos7.0下文件格式为xxx.tar.xz,解压和压缩命令: 压缩 tar -Jcf linux-3.10.0-123.13.1.el7.tar.xz(文件名) linux-3.10.0 ...
- Liunx文件解压与压缩
文件压缩和解压缩 常见压缩格式如下 .zip .gz .bz2 .tar.gz .tar.gz2 .zip压缩 zip 压缩文件名 源文件 压缩文件 zip -r(递归) 压缩文件名 源目录 压缩目录 ...
随机推荐
- Xcode 9运行h d f报错
SocialSDKXib/UMSCommentInputController.xib: error: Illegal Configuration: Compiling IB documents for ...
- Kubernetes网络的4种解决方案
一.Kubernetes + Flannel Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的 ...
- 一个简单的servlet查询
首先创建一个dynamic web project. 写一个test.jsp: 新建一个servlet: 新建一个student.jsp: 显示如图:
- Shell 和Python的区别。
shell 应该属于宏语言,顾名思义是系统的壳,方便与系统交互的在以下情况下,不使用shell,因为shell对此无能为力:如:跨平台,较复杂数学操作(如浮点运算,精确运算等),图形化界面 GUI,I ...
- 事务控制及try catch
一.事务控制 BEGIN TRY BEGIN TRAN; DECLARE @aaa NVARCHAR(MAX); SET @aaa = 9 / 0; COMMIT TRAN;END TRYBEGIN ...
- 新版微信小程序即将上线 新增微信支付功能
<经济参考报>消息,新版微信小程序正在测试中,有可能将在近期正式上线.新版小程序增加了“附近门店”功能的接口,微信用户可以通过定位功能,查看提供线下服务的各类门店,并直接利用小程序实现包括 ...
- UMI标签学习【转载】
转自: https://club.1688.com/threadview/50123159.htm 简单介绍一下利用单分子标签(Unique Molecular Identifier,UMI)对残留噪 ...
- 7.5 Models -- Persisting Records
一.概述 1. 在Ember Data上以每个实例为基础,records被持久化.在DS.Model的任何一个实例上调用save()并且它将产生一个网络请求. 2. 下面是一些例子: var post ...
- 转载自(http://snailz.diandian.com/post/2012-10-24/40041265730)
PHP 5.4.8 添加系统服务命令 之前没注意,PHP 5.4.8 的安装包有自带的系统服务注册文件的 打开编译安装包,换成你自己的路径 cd /mydata/soft/php-5.4.8/ cp ...
- 人生苦短之我用Python篇(socket编程)
socket模块 实现简单的远程连接: 客户端: import socket client = socket.socket()#声明socket类型,同时生成socke连接t对象 client.con ...