首页 > 代码库 > c++builder ZIP文件解压与压缩(ZLIB DLL调用)(转载 )
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 else140 { //删除找到的文件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调用)(转载 )
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。