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