c++builder ZIP文件解压与压缩(ZLIB DLL调用)(转载 )

转载: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[260]={0};
 96     char filename[260]={0};
 97     int len = 0;
 98     int    ch = ‘\\‘;
 99     strcpy(dir, dir_fullpath);
100     len = strlen(dir);
101     char *temp = strrchr(dir,ch);//查找\\
102     if(len < 4 || temp == NULL)     //根据后面的\\来判断,可能为磁盘根目录或者不是有效的目录路径
103     return false;
104
105     if(temp != NULL)
106     {
107         if((temp - dir + 1) != len)     //在目录后添加 ‘\\‘
108         strcat(dir,"\\");
109     }
110     GetCurrentDirectory(260,filename);//得到当前目录
111     strcat(filename,"\\");
112     if(strcmp(dir,filename)==0)    //如果要删除的目录是当前目录
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[0] != ‘.‘)
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;// 删除对像
时间: 2024-10-15 12:04:35

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

Linux系统下ZIP文件解压和压缩命令

zip all.zip *.jpg   #将所有.jpg的文件压缩成一个zip包 unzip all.zip    #将all.zip中的所有文件解压到当前目录中 unzip all.zip -d all #将all.zip 中的所有文件解压到当前目录中的all文件夹中 zip -r hy.zip hy  #将当前目录下的hy文件夹压缩为hy.zip zip -r hy.zip hy 123.txt  #将当前目录下的hy文件夹和123.txt压缩为hy.zip 作者:open210 来源:CS

zip文件解压或压缩

<span style="font-size:18px;">/** * lsz */ public final class ZipUtil { /** * 解压zip文件 * @param unZipfile * @param destFile */ public static void unZip(String unZipfile, String destFile) { FileOutputStream fileOut; File file; InputStream in

ZIP文件解压

public class DZip { /// <summary> /// 压缩为ZIP文件 /// </summary> public void Zip(string directory,string fileName) { //using (var archive = ZipArchive.Create()) //{ // archive.AddAllFromDirectory(@"C:\\source"); // archive.SaveTo(@"

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

linux  zip命令的基本用法是: zip [参数] [打包后的文件名] [打包的目录路径] linux  zip命令参数列表: -a     将文件转成ASCII模式 -F     尝试修复损坏的压缩文件     -h     显示帮助界面 -m     将文件压缩之后,删除源文件 -n 特定字符串    不压缩具有特定字尾字符串的文件 -o     将压缩文件内的所有文件的最新变动时间设为压缩时候的时间 -q     安静模式,在压缩的时候不显示指令的执行过程 -r     将指定的目录

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

文章来源: https://www.zhihu.com/question/20523036 今天邮件中收到了一个压缩文件,解压后却是乱码,从网上也找了几个方法,目前这个方法还是比较可靠的,如下所示: 7z方案 需要安装p7zip和convmv,在Fedora下的命令是 su -c 'yum install p7zip convmv' 在ubuntu下的安装命令是 sudo apt-get install p7zip convmv 安装完之后,就可以用7za和convmv两个命令完成解压缩任务.

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

C#解压RAR压缩文件(--转载--测试通过) using System; using System.Collections.Generic; using System.Text; using System.IO; using Microsoft.Win32; using System.Diagnostics; namespace Uni.UniCustoms { public class clsWinrar { /// <summary> /// 是否安装了Winrar /// </s

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

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

linux下zip文件解压后乱码解决方案

解决办法一,利用pyton来处理 1.vi uzip文件2.复制一下内容(Python) #!/usr/bin/env python # -*- coding: utf-8 -*- # uzip.py import os import sys import zipfile print "Processing File " + sys.argv[1] file=zipfile.ZipFile(sys.argv[1],"r"); for name in file.nam

initramfs.img,ramdisk 文件解压与压缩

1, 重命名gz 压缩文件 mv initramfs.img  initramfs.img.gz 2, 解压文件 186  gunzip initramfs.img.gz 3, 查看文件类型  188  file initramfs.img 4, 创建目录  189  mkdir temp  190  cd temp 5, 解压目录  193  cpio -i -F ../initramfs.img 6, 压缩文件 find . |cpio -ov -H newc |gzip > ../init