Scene:
1. Windows did not find the system provided by the Win32 API to generate a Zip compressed file, there is known that Daniel Trouble to leave a message.
2. Zlib is more commonly used, compiling is also convenient, use it to do compression. The MACOSX platform supports the Zlib library by default.
Http://zlib.net
3. The src\contrib\minizip\minizip.c in the Zlib library has compression examples, I am using zlib 1.2.5, compiled with VS2010. :
http://download.csdn.net/detail/infoworld/8177625
4. I encapsulated a bit ziphelper easy to use, first of all compile zlib for the DLL version, this class is to cut some things minizip.c, support the Chinese path, the project needs to support only one level of directory, if there are sub-directory is not difficult, you change it.
5. How to use, note that the path string must be UTF8 format encoding, compile with the precompiled macro Zlib_winapi
Ziphelper Z;z.addfile (utf8_path1); Z.addfile (utf8_path2); Z.tozip (Utf8_output_zip_path);
6. MacOSX has not been measured, in theory should be able to compile.
7. Helpful help to top down or leave a message.
Zip_helper.h
#ifndef __zip_helper#define __zip_helper#include <vector> #include <string>//1. Subdirectories not supported//NOTE: Because the zlib library is used, When used, add precompiled Macro Zlib_winapiclass Ziphelper{public:ziphelper () {}~ziphelper () {}//path:utf8 pathziphelper& AddFile ( Const char* Input_path)//output_path:utf8 pathbool tozip (const char* output_path);p rivate:std::vector<std:: String> Files_;}; #endif
Zip_helper.cpp
#include "zip_helper.h" #ifndef _win32#ifndef __use_file_offset64#define __use_file_offset64#endif#ifndef __USE_ Largefile64#define __use_largefile64#endif#ifndef _largefile64_source#define _largefile64_source#endif#ifndef _ File_offset_bit#define _file_offset_bit 64#endif#endif#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <errno.h> #include <fcntl.h> #include <direct.h># Include <io.h> #include "zlib.h" #include "zip.h" #ifdef _win32#define usewin32ioapi#include "Iowin32.h" #endif # Define WRITEBUFFERSIZE (16384) #define MAXFILENAME (#ifdef _win32static wchar_t* qxutf82unicode (const char* UTF) {if (!utf | |!strlen (UTF)) {return NULL; } int dwunicodelen = MultiByteToWideChar (cp_utf8,0,utf,-1,null,0); size_t num = dwunicodelen*sizeof (wchar_t); wchar_t *pwtext = (wchar_t*) malloc (num); memset (Pwtext,0,num); MultiByteToWideChar (Cp_utf8,0,utf,-1,pwtext,dwunicodelen); return pwtext; } Static file* ZipfopeN (const char* path,const char* mode) {wchar_t* Path_u = qxutf82unicode (path); wchar_t* Mode_u = Qxutf82unicode (mode); file* file = _wfopen (Path_u,mode_u), free (Path_u), free (Mode_u), return file; /* Name of file to get info on *//* return value:access, modific. and creation times *//* dostime */ulong filetime (const char* F, Tm_zip *tmzip, ULong *dt) {int ret = 0;{ FILETIME ftlocal; HANDLE Hfind; Win32_find_data ff32;wchar_t *unicode = Qxutf82unicode (f); hfind = FindFirstFile (UNICODE,&FF32); if (hFind! = INVALID _handle_value) {filetimetolocalfiletime (& (Ff32.ftlastwritetime), &ftlocal); Filetimetodosdatetime (&ftlocal, ((lpword) DT) +1, ((lpword) DT) +0); FindClose (hfind); ret = 1;} Free (Unicode);} return ret;} #else # define Zipfopen fopen; #endifZipHelper & Ziphelper::addfile (const char* input_path) {files_.push_back (input_ path); return *this;} BOOL Ziphelper::tozip (const char* output_path) {int Err=0;zipfile zf;int errclose;int opt_compress_level = Z_DEFAULT_ COMPRESSION, #ifdef USEWIN32IOAPizlib_filefunc64_def ffunc;fill_win32_filefunc64w (&ffunc); wchar_t* Temp_path = QXUtf82Unicode (Output_path); ZF = zipopen2_64 (Temp_path,append_status_create,null,&ffunc); free (temp_path); #elsezf = ZipOpen64 (Output_path, Append_status_create); #endifif (ZF = = NULL) {printf ("Error opening%s\n", Output_path); err= Zip_errno;return false;} int size = Files_.size (); void* buf = Null;int size_buf = writebuffersize; BUF = (void*) malloc (SIZE_BUF); for (int i = 0; i < size; ++i) {FILE * fin;int size_read;const char* filenameinzip = files _[I].C_STR (); const char *savefilenameinzip;zip_fileinfo zi;unsigned long crcfile=0;int zip64 = 0;zi.tmz_date.tm_sec = Zi . tmz_date.tm_min = Zi.tmz_date.tm_hour =zi.tmz_date.tm_mday = Zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;zi.dosdate = 0 ; zi.internal_fa = 0;zi.external_fa = 0;filetime (filenameinzip,&zi.tmz_date,&zi.dosdate); savefilenameinzip = Filenameinzip;const char* pos = null;if (pos = STRRCHR (savefilenameinzip, ' \ \ ')) | | (pos = STRRCHR (savefiLenameinzip, '/'))) {pos++;} Else{pos = Savefilenameinzip;} Err = zipopennewfileinzip3_64 (Zf,pos,&zi,null,0,null,0,null, (opt_compress_level! = 0)? Z_deflated:0,opt_compress_level,0,-max_wbits, Def_mem_level, Z_default_strategy,null,crcfile, ZIP64); if (Err! = ZIP_ OK) {printf ("Error in opening%s in zipfile\n", POS);} Else{fin = Zipfopen (Filenameinzip, "RB"), if (fin==null) {err=zip_errno;printf ("error in opening%s for reading\n", Filenameinzip);}} if (err = = ZIP_OK) Do{err = Zip_ok;size_read = (int) fread (buf,1,size_buf,fin); if (Size_read < size_buf) {if (feof (fin) = = 0) {printf ("Error in Reading%s\n", filenameinzip); err = Zip_errno;}} if (size_read>0) {err = Zipwriteinfileinzip (Zf,buf,size_read), if (err<0) {printf ("Error in writing%s in the ZipFile \ n ", Filenameinzip);}}} while (err = = ZIP_OK) && (size_read>0)); if (Fin) {fclose (Fin);} if (err<0) {Err=zip_errno;} Else{err = Zipclosefileinzip (ZF); if (ERR!=ZIP_OK) {printf ("Error in closing%s in the zipfile\n", Filenameinzip);}}} Errclose = Zipclose (Zf,null), if (errclose! = ZIP_OK) {printf ("Error in closing%s\n", Output_path); return false;} return true;}
Note: If you add an error when linking to the project, it is because you have not precompiled the macro Zlib_winapi
1>zip_helper.obj:error LNK2001: unresolved external symbol _zipclose
[c/c++]_[primary]_[using zlib Library compressed file]