1
#include "zlib.h" 2 #include "zip.h" 3 #include "unzip.h" 4 #include <string> 5 #pragma comment(lib, "minizip.lib") 6 #pragma comment(lib, "zlib.lib") 7 8 9 #define dir_delimter '/' 10 #define MAX_FILENAME 512 11 #define READ_SIZE 8192 12 13 using std::string; 14 15 int SAWrite(unzFile &zipfile, char* name) 16 { 17 if (name == NULL){ 18 return -1; 19 } 20 CreateDir(name); 21 FILE *out = fopen(name, "wb"); 22 if (out == NULL){ 23 return -1; 24 } 25 26 char read_buffer[READ_SIZE]={0}; 27 int error = UNZ_OK; 28 do 29 { 30 error = unzReadCurrentFile(zipfile, read_buffer, READ_SIZE); 31 if (error < 0) return -1; 32 33 if (error > 0){ 34 fwrite(read_buffer, error, 1, out); 35 } 36 } while (error > 0); 37 38 fclose(out); 39 out = NULL; 40 return 0; 41 } 42 43 int CreateDir(const char *sPathName) 44 { 45 char DirName[256]={0}; 46 strcpy(DirName, sPathName); 47 int len = strlen(DirName); 48 for (int i=1; i<len; i++){ 49 if (DirName[i]!='/'){ 50 continue; 51 } 52 DirName[i] = 0; 53 if (access(DirName, NULL)!=0 && mkdir(DirName)==-1) 54 { 55 return -1; 56 } 57 DirName[i] = '/'; 58 } 59 60 return 0; 61 } 62 63 64 int SAUnzip(string strFullFile, string strFolder) 65 { 66 unzFile zipfile = unzOpen(strFullFile.c_str()); 67 if (zipfile == NULL) return -1; 68 69 unz_global_info global_info; 70 if (unzGetGlobalInfo(zipfile, &global_info)!=UNZ_OK){ 71 unzClose(zipfile); 72 return -1; 73 } 74 char read_buffer[READ_SIZE]={0}; 75 76 for (uLong i = 0; i<global_info.number_entry; ++i){ 77 unz_file_info64 file_info64; 78 char filename[MAX_FILENAME]={0}; 79 unzGetCurrentFileInfo64(zipfile, &file_info64, filename, 80 sizeof(filename), NULL, 0, NULL, 0); 81 82 const size_t filename_length = strlen(filename); 83 char name[256] = {0}; 84 if (filename[filename_length-1] == dir_delimter) 85 { 86 sprintf(name, "%s/%s", strFolder.c_str(), filename); 87 CreateDir(name); 88 } 89 else 90 { 91 if (unzOpenCurrentFile(zipfile) != UNZ_OK) 92 { 93 unzClose(zipfile); 94 return -1; 95 } 96 sprintf(name, "%s/%s", strFolder.c_str(), filename); 97 98 if (SAWrite(zipfile, name) < 0) 99 { 100 unzCloseCurrentFile(zipfile); 101 unzClose(zipfile); 102 return -1; 103 } 104 setFileTime(name, file_info64.dosDate); 105 } 106 unzCloseCurrentFile(zipfile); 107 108 if ((i+1) < global_info.number_entry && unzGoToNextFile(zipfile) != UNZ_OK){ 109 unzClose(zipfile); 110 return -1; 111 } 112 } 113 unzClose(zipfile); 114 115 return 0; 116 } 117 118 int main( int argc, char **argv) 119 { 120 SAUnzip("E:/test.zip", "E:/1/2/3/4/"); 121 return 0; 122 }

 请注明来源:http://www.cnblogs.com/zhfuliang/p/3246122.html

分类:

技术点:

相关文章: