minizip c++ 压缩文件及文件夹

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
 
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
 
#include "minizip/zip.h"
#include "minizip/unzip.h"
 
using  namespace  std;
 
void  EnumDirFiles( const  string& dirPrefix, const  string& dirName,vector<string>& vFiles)
{
     if  (dirPrefix.empty() || dirName.empty())
         return ;
     string dirNameTmp = dirName;
     string dirPre = dirPrefix;
     
     if  (dirNameTmp.find_last_of( "/" ) != dirNameTmp.length() - 1)
         dirNameTmp +=  "/" ;
     if  (dirNameTmp[0] ==  '/' )
         dirNameTmp = dirNameTmp.substr(1);
     if  (dirPre.find_last_of( "/" ) != dirPre.length() - 1)
         dirPre +=  "/" ;
     
     string path;
 
     path = dirPre + dirNameTmp;
 
 
     struct  stat fileStat;
     DIR* pDir = opendir(path.c_str());
     if  (!pDir)  return ;
 
     struct  dirent* pDirEnt = NULL;
     while  ( (pDirEnt = readdir(pDir)) != NULL )
     {
         if  ( strcmp (pDirEnt->d_name, "." ) == 0 ||  strcmp (pDirEnt->d_name, ".." ) == 0)
             continue ;
 
         string tmpDir = dirPre + dirNameTmp + pDirEnt->d_name;
         if  (stat(tmpDir.c_str(),&fileStat) != 0)
             continue ;
 
         string innerDir = dirNameTmp + pDirEnt->d_name;
         if  (fileStat.st_mode & S_IFDIR == S_IFDIR)
         {
             EnumDirFiles(dirPrefix,innerDir,vFiles);
             continue ;
         }
 
         vFiles.push_back(innerDir);
     }
 
     if  (pDir)
         closedir(pDir);
}
 
int  writeInZipFile(zipFile zFile, const  string& file)
{
     fstream f(file.c_str(),std::ios::binary | std::ios::in);
     f.seekg(0, std::ios::end);
     long  size = f.tellg();
     f.seekg(0, std::ios::beg);
     if  ( size <= 0 )
     {
         return  zipWriteInFileInZip(zFile,NULL,0);
     }
     char * buf =  new  char [size];
     f.read(buf,size);
     int  ret = zipWriteInFileInZip(zFile,buf,size);
     delete [] buf;
     return  ret;
}
 
int  main( int  argc,  char  *argv[])
{
     if  (argc < 3)
     {
         cout<< "usage: mini from to" <<endl;
         return  -1;
     }
     string dest = string(argv[1]);
     string src = string(argv[2]);
     if  (src.find_last_of( "/" ) == src.length() - 1)
         src = src.substr(0,src.length()-1);
 
     struct  stat fileInfo;
     stat(src.c_str(), &fileInfo);
     if  (S_ISREG(fileInfo.st_mode))
     {
         zipFile zFile = zipOpen(dest.c_str(),APPEND_STATUS_CREATE);
         if  (zFile == NULL)
         {
             cout<< "openfile failed" <<endl;
             return  -1;
         }
         zip_fileinfo zFileInfo = { 0 };
         int  ret = zipOpenNewFileInZip(zFile,src.c_str(),&zFileInfo,NULL,0,NULL,0,NULL,0,Z_DEFAULT_COMPRESSION);
         if  (ret != ZIP_OK)
         {
             cout<< "openfile in zip failed" <<endl;
             zipClose(zFile,NULL);
             return  -1;
         }
         ret = writeInZipFile(zFile,src);
         if  (ret != ZIP_OK)
         {
             cout<< "write in zip failed" <<endl;
             zipClose(zFile,NULL);
             return  -1;
         }
         zipClose(zFile,NULL);
         cout<< "zip ok" <<endl;
     }
     else  if  (S_ISDIR(fileInfo.st_mode))
     {
         size_t  pos = src.find_last_of( "/" );
         string dirName = src.substr(pos + 1);
         string dirPrefix = src.substr(0,pos);
 
         zipFile zFile = zipOpen(dest.c_str(),APPEND_STATUS_CREATE);
         if  (zFile == NULL)
         {
             cout<< "openfile failed" <<endl;
             return  -1;
         }
 
         vector<string> vFiles;
         EnumDirFiles(dirPrefix,dirName,vFiles);
         vector<string>::iterator itF = vFiles.begin();
         for (;itF != vFiles.end(); ++itF)
         {
             zip_fileinfo zFileInfo = { 0 };
             int  ret = zipOpenNewFileInZip(zFile,itF->c_str(),&zFileInfo,NULL,0,NULL,0,NULL,0,Z_DEFAULT_COMPRESSION);
             if  (ret != ZIP_OK)
             {
                 cout<< "openfile in zip failed" <<endl;
                 zipClose(zFile,NULL);
                 return  -1;
             }
             ret = writeInZipFile(zFile,*itF);
             if  (ret != ZIP_OK)
             {
                 cout<< "write in zip failed" <<endl;
                 zipClose(zFile,NULL);
                 return  -1;
             }
         }
 
         zipClose(zFile,NULL);
         cout<< "zip ok" <<endl;
     }
     return  0;
}
1
2
3
4
5
6
7
8
9
10
target=mini
 
lib=-lminizip -laes -lz 
libpath=-L /usr/local/lib
incpath=-I /usr/local/include
${target}:
     g++ main.cpp -g -o $@ ${lib} ${libpath} ${incpath}
 
clean:
     - rm  ${target}









本文转自 hakuyo 51CTO博客,原文链接:http://blog.51cto.com/hakuyo/1958102,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
19 0
Linux c/c++文件的基本操作
|
5月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
46 0
|
1月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
66 0
|
1月前
|
C++
【状态压缩DP】 毕业旅行问题(C/C++)
【状态压缩DP】 毕业旅行问题(C/C++)
|
2月前
|
Linux API C++
超级好用的C++实用库之文件目录操作
超级好用的C++实用库之文件目录操作
32 0
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
19 0
|
3月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
|
3月前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】