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(递归) 压缩文件名 源目录 压缩目录 ...
随机推荐
- Oracle卸载之Linux下卸载oracle11g的方法
1.使用SQL*PLUS停止数据库 如果不能通过sysdba登陆可以用nolog用户登陆后切换至sysdba [oracle@OracleTest oracle]$ sqlplus /nolog S ...
- 使用Homebrew在Mac OS X EI Capitan上安装与配置nginx和PHP
安装nginx brew install nginx sudo nginx 测试安装 在浏览器打开下面的链接地址 http://localhost:8080 nginx.conf配置 # HTTPS ...
- angular2新建的项目上传github
前提1.git配置好,参见博文 git常用操作 2.angular2安装配置好,这个网上有很多教程,就不多说了,参见angular2快速起步 需要注意的是,大部分问题都是网络问题. 3.新建一个ng项 ...
- 14nm或于6月量产,中芯首次披露12nm及第二代FinFET "N+1"计划(详细数据)
日前中芯国际公布2018年度第四季度业绩,实现营收7.88亿美元,14nm工艺进入客户验证阶段,可望于今年6月份量产,且12nm工艺开发取得突破. 根据中芯国际披露的财报,2018年第四季度实现营业收 ...
- router-link params传参
1.router.js配置 需要在路径后定义上要传的属性名 --> /:属性名(query方式不需要) { path: '/CreateProgress/:name1', name: ...
- 迁移到 Linux:使用 sudo | Linux 中国
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/80976600 https://mmbi ...
- .NET数据挖掘与机器学习开源框架
1. 数据挖掘与机器学习开源框架 1.1 框架概述 1.1.1 AForge.NET AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经 ...
- host文件常用地址
#+UPDATE_TIME 2016-02-16 19:52:05 UTC+8#+MESSAGE#################################################### ...
- [py][mx]django添加后台课程机构页数据-图片上传设置
分析下课程页前台部分 机构类别-目前机构库中没有这个字段,需要追加下 所在地区 xadmin可以手动添加 课程机构 涉及到机构封面图, 即图片上传media设置, 也需要在xadmin里手动添加几条 ...
- jmeter 测试websocket接口(一)
jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...