转载:http://blog.csdn.net/goodai007/article/details/7414512

头文件:ZipAndFile.h

  1. //---------------------------------------------------------------------------
  2.  
  3. #ifndef ZipAndFileH
  4. #define ZipAndFileH
  5. #include <Classes.hpp>
  6. //---------------------------------------------------------------------------
  7. class ZipAndFile{
  8. private:
  9.  
  10. public:
  11. ZipAndFile();
  12. ~ZipAndFile();
  13. //ZIP操作
  14. bool DoZipfile(String DoZip,String ZipFilename,String SourceFile,bool Check);
  15. //复制目录
  16. bool MyCopyFiles(AnsiString FromFile,AnsiString ToFile);
  17. //删除目录
  18. bool deldir(char* dir_fullpath);
  19. };
  20. #endif

源文件:ZipAndFile.cpp

  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "ZipAndFile.h"
  4. #include "Tlhelp32.h"
  5. #include <vcl.h>
  6.  
  7. //---------------------------------------------------------------------------
  8. ZipAndFile::ZipAndFile()
  9. {
  10. }
  11. ZipAndFile::~ZipAndFile()
  12. {
  13. }
  14. //ZIP压缩与解压
  15. //---------------------------------------------------------------------------
  16. bool ZipAndFile::DoZipfile(String DoZip,String ZipFilename,String SourceFile,bool Check)
  17. {
  18. bool ZipReturn=false;
  19. WideString w1;//必需要这样申请WideString变量,不然传值时会让两个变量使用同一样内存地址,搞了3个小时才发现这是BCB2006的BUG.
  20. WideString w2;
  21. LPCTSTR L1;//必需使用这个格式的变量,不然传过去到DLL时乱码。
  22. LPCTSTR L2;
  23. if(DoZip=="ZWZipCompress")//压缩
  24. {
  25. w1=SourceFile;
  26. w2=ZipFilename;
  27. L1=(const char*)w1.c_bstr();
  28. L2=(const char*)w2.c_bstr();
  29. bool __stdcall (*DllMethods)(LPCTSTR,LPCTSTR,bool);
  30. HINSTANCE hInst=NULL;
  31. hInst=LoadLibrary((ExtractFilePath(Application->ExeName)+"ZLibWrap.dll").c_str());//动态加载DLL //当前目录下的DLL文件
  32. FARPROC P;
  33. P = GetProcAddress(hInst,DoZip.c_str());
  34. DllMethods=(bool __stdcall (__cdecl *)(LPCTSTR,LPCTSTR,bool))P;
  35. if(DllMethods){
  36. ZipReturn=DllMethods(L1,L2,Check);
  37. }
  38. FreeLibrary(hInst);
  39. return ZipReturn;
  40. }else if(DoZip=="ZWZipExtract")//解压
  41. {
  42. w1=ZipFilename;
  43. w2=SourceFile;
  44. L1=(const char*)w1.c_bstr();
  45. L2=(const char*)w2.c_bstr();
  46. bool __stdcall (*DllMethods)(LPCTSTR,LPCTSTR);
  47. HINSTANCE hInst=NULL;
  48. hInst=LoadLibrary((ExtractFilePath(Application->ExeName)+"ZLibWrap.dll").c_str());//动态加载DLL //当前目录下的DLL文件
  49. FARPROC P;
  50. P = GetProcAddress(hInst,DoZip.c_str());
  51. DllMethods=(bool __stdcall (__cdecl *)(LPCTSTR,LPCTSTR))P;
  52. if(DllMethods){
  53. ZipReturn=DllMethods(L1,L2);
  54. }
  55. FreeLibrary(hInst);
  56. return ZipReturn;
  57. }
  58. }
  59. //复制目录文件
  60. //---------------------------------------------------------------------------
  61. bool ZipAndFile::MyCopyFiles(AnsiString FromFile,AnsiString ToFile)
  62. {
  63. while(true){
  64. if (!DirectoryExists(ToFile)){
  65. CreateDir(ToFile);//文件夹不存在则创建
  66. break;
  67. }else{
  68. deldir(ToFile.c_str());//在就删除
  69. }
  70. }
  71. SHFILEOPSTRUCT op;
  72. String strFrom = FromFile+"\\*.*";
  73. String strTo = ToFile;
  74. op.fAnyOperationsAborted = true;
  75. op.hwnd = NULL;
  76. op.wFunc = FO_COPY;
  77. op.pFrom = strFrom.c_str();
  78. op.pTo = strTo.c_str();
  79. op.fFlags = FOF_NOCONFIRMATION |FOF_NOCONFIRMMKDIR; //FOF_NOCONFIRMATION 不出现确认对话框(当需要覆盖时)
  80. bool b=false;
  81. b=SHFileOperation(&op);
  82. //int kkk= SHFileOperation(&op);
  83. switch(GetLastError())
  84. {
  85. //只要出错就弹出
  86. return false;
  87. }
  88.  
  89. return(b);
  90. }
  91. //删除目录文件
  92. //---------------------------------------------------------------------------
  93. bool ZipAndFile::deldir(char* dir_fullpath) //删除指定的目录
  94. {
  95. char dir[]={};
  96. char filename[]={};
  97. int len = ;
  98. int ch = '\\';
  99. strcpy(dir, dir_fullpath);
  100. len = strlen(dir);
  101. char *temp = strrchr(dir,ch);//查找\\
  102. if(len < || temp == NULL) //根据后面的\\来判断,可能为磁盘根目录或者不是有效的目录路径
  103. return false;
  104.  
  105. if(temp != NULL)
  106. {
  107. if((temp - dir + ) != len) //在目录后添加 '\\'
  108. strcat(dir,"\\");
  109. }
  110. GetCurrentDirectory(,filename);//得到当前目录
  111. strcat(filename,"\\");
  112. if(strcmp(dir,filename)==) //如果要删除的目录是当前目录
  113. {
  114. strcat(filename,"..");
  115. SetCurrentDirectory(filename); //改变当前目录
  116. }
  117.  
  118. WIN32_FIND_DATA finddata;
  119. HANDLE fFile;
  120. bool flag;
  121. strcpy(filename,dir);
  122. strcat(filename,"*.*");
  123. fFile=FindFirstFile(filename,&finddata);
  124. flag=true;
  125. if(fFile!=INVALID_HANDLE_VALUE) //此目录有没有效
  126. {
  127. BOOL bfind=true;
  128. while(bfind)
  129. {
  130. if(finddata.cFileName[] != '.')
  131. {
  132. strcpy(filename,dir);
  133. strcat(filename,finddata.cFileName);
  134. if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//判断是不是文件夹
  135. { //删除找到的子目录
  136. strcat(filename,"\\");//如果文件夹就再加上\\后进行递归
  137. flag = flag && deldir(filename); //递归
  138. }
  139. else
  140. { //删除找到的文件
  141. SetFileAttributes(filename,FILE_ATTRIBUTE_NORMAL);//文件属性设为普通
  142. flag = flag && DeleteFile(filename); //删除
  143. }
  144. }
  145. bfind = FindNextFile(fFile,&finddata);
  146. }
  147. FindClose(fFile);
  148. }
  149. if(flag)
  150. {
  151. SetFileAttributes(dir_fullpath,FILE_ATTRIBUTE_NORMAL);//去掉只读
  152. if(RemoveDirectory(dir_fullpath))//删除空目录
  153. return true;
  154. }
  155. return false;
  156. }

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

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

c++builder ZIP文件解压与压缩(ZLIB DLL调用)(转载 )的更多相关文章

  1. zip文件解压或压缩

    <span style="font-size:18px;">/** * lsz */ public final class ZipUtil { /** * 解压zip文 ...

  2. ZIP文件解压

    public class DZip { /// <summary> /// 压缩为ZIP文件 /// </summary> public void Zip(string dir ...

  3. linux下压缩成zip文件解压zip文件

    linux  zip命令的基本用法是: zip [参数] [打包后的文件名] [打包的目录路径] linux  zip命令参数列表: -a     将文件转成ASCII模式 -F     尝试修复损坏 ...

  4. Linux:文件解压与压缩

    文件打包与压缩 常见压缩文件格式: |文件后缀名 |说明| |.zip |zip程序打包压缩的文件| |.rar |rar程序压缩的文件| |.7z |7zip程序压缩的文件| |.tar |tar程 ...

  5. asp.net实现文件解压和压缩

    C#解压RAR压缩文件(--转载--测试通过) using System; using System.Collections.Generic; using System.Text; using Sys ...

  6. Linux 下 zip 文件解压乱码解决方案,ubuntu16.10亲测可用

    文章来源: https://www.zhihu.com/question/20523036 今天邮件中收到了一个压缩文件,解压后却是乱码,从网上也找了几个方法,目前这个方法还是比较可靠的,如下所示: ...

  7. Python实现加密的ZIP文件解压(密码已知)

    博主在上篇博文介绍了<Python实现加密的RAR文件解压(密码已知)>后,又尝试了ZIP文件的解压方法,下面开始分享. 当ZIP文件的压缩密码已知时,可以通过调用zipfile库进行解压 ...

  8. linux .tar.xz 文件解压和压缩

    场景:centos7.0下文件格式为xxx.tar.xz,解压和压缩命令: 压缩 tar -Jcf linux-3.10.0-123.13.1.el7.tar.xz(文件名) linux-3.10.0 ...

  9. Liunx文件解压与压缩

    文件压缩和解压缩 常见压缩格式如下 .zip .gz .bz2 .tar.gz .tar.gz2 .zip压缩 zip 压缩文件名 源文件 压缩文件 zip -r(递归) 压缩文件名 源目录 压缩目录 ...

随机推荐

  1. Oracle卸载之Linux下卸载oracle11g的方法

    1.使用SQL*PLUS停止数据库  如果不能通过sysdba登陆可以用nolog用户登陆后切换至sysdba [oracle@OracleTest oracle]$ sqlplus /nolog S ...

  2. 使用Homebrew在Mac OS X EI Capitan上安装与配置nginx和PHP

    安装nginx brew install nginx sudo nginx 测试安装 在浏览器打开下面的链接地址 http://localhost:8080 nginx.conf配置 # HTTPS ...

  3. angular2新建的项目上传github

    前提1.git配置好,参见博文 git常用操作 2.angular2安装配置好,这个网上有很多教程,就不多说了,参见angular2快速起步 需要注意的是,大部分问题都是网络问题. 3.新建一个ng项 ...

  4. 14nm或于6月量产,中芯首次披露12nm及第二代FinFET "N+1"计划(详细数据)

    日前中芯国际公布2018年度第四季度业绩,实现营收7.88亿美元,14nm工艺进入客户验证阶段,可望于今年6月份量产,且12nm工艺开发取得突破. 根据中芯国际披露的财报,2018年第四季度实现营业收 ...

  5. router-link params传参

    1.router.js配置 需要在路径后定义上要传的属性名 -->       /:属性名(query方式不需要) { path: '/CreateProgress/:name1', name: ...

  6. 迁移到 Linux:使用 sudo | Linux 中国

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/80976600 https://mmbi ...

  7. .NET数据挖掘与机器学习开源框架

    1.    数据挖掘与机器学习开源框架 1.1 框架概述 1.1.1 AForge.NET AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经 ...

  8. host文件常用地址

    #+UPDATE_TIME 2016-02-16 19:52:05 UTC+8#+MESSAGE#################################################### ...

  9. [py][mx]django添加后台课程机构页数据-图片上传设置

    分析下课程页前台部分 机构类别-目前机构库中没有这个字段,需要追加下 所在地区 xadmin可以手动添加 课程机构 涉及到机构封面图, 即图片上传media设置, 也需要在xadmin里手动添加几条 ...

  10. jmeter 测试websocket接口(一)

    jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...