Skip to content

Instantly share code, notes, and snippets.

@sotex
Last active March 6, 2019 06:22
Show Gist options
  • Save sotex/517b8b7d72dfde364447d02bc8c8a815 to your computer and use it in GitHub Desktop.
Save sotex/517b8b7d72dfde364447d02bc8c8a815 to your computer and use it in GitHub Desktop.
使用zlib库将一个目录下所有文件打包为一个zip压缩包
#include "zlib.h"
#include "zip.h"
#ifdef _WIN32
#define USEWIN32IOAPI
#include "iowin32.h"
#endif
#include <QTime>
#include <QDebug>
#include <QFile>
#include <QDir>
#include <QDateTime>
inline std::string ToUtf8(const QString& str)
{
QByteArray u8 = str.toUtf8();
return std::string(u8.data(),u8.size());
}
// 递归列出目录项
QStringList FileListR(const QDir& dir)
{
QFileInfoList fileinfolist = dir.entryInfoList(
QDir::NoDotAndDotDot|QDir::Files|QDir::Dirs);
QStringList files;
for(int i=0;i<fileinfolist.size();++i){
QFileInfo& info = fileinfolist[i];
if(info.isDir()){
files.append(FileListR(QDir(info.filePath())));
continue;
}
files.append(info.filePath());
}
return files;
}
// zlib打包压缩
void zlib_archive_compress(QString path,QString outpath)
{
QDir dir(path);
QStringList entrylist = FileListR(dir);
int err = 0;
zipFile zipfile;
#ifdef _WIN32
zlib_filefunc64_def ffunc64;
fill_win32_filefunc64W(&ffunc64);
std::wstring wpath = outpath.toStdWString();
zipfile = zipOpen2_64(wpath.c_str(),APPEND_STATUS_CREATE,NULL,&ffunc64);
#else
zipfile = zipOpen64(ToUtf8(path).c_str(),APPEND_STATUS_CREATE);
#endif
if(zipfile == NULL){
qDebug()<<"zipOpen64 error " << ZIP_ERRNO;
return;
}
for(int i=0;i<entrylist.size();++i){
QFileInfo info(entrylist[i]);
QDateTime ctime = info.created();
zip_fileinfo zipinfo;
zipinfo.tmz_date.tm_year = ctime.date().year();
zipinfo.tmz_date.tm_mon = ctime.date().month();
zipinfo.tmz_date.tm_mday = ctime.date().day();
zipinfo.tmz_date.tm_hour = ctime.time().hour();
zipinfo.tmz_date.tm_min = ctime.time().minute();
zipinfo.tmz_date.tm_sec = ctime.time().second();
zipinfo.dosDate = 0;
zipinfo.external_fa = zipinfo.internal_fa = 0;
qDebug()<<info.filePath();
if(info.suffix() != QString::fromAscii("tif")){
err = zipOpenNewFileInZip3_64(
zipfile,
ToUtf8(info.filePath().remove(dir.path())).c_str(), /*在zip文件中的文件路径*/
&zipinfo,
NULL,0,NULL,0,NULL,
Z_DEFLATED,Z_DEFAULT_COMPRESSION, /*压缩参数(默认参数)*/
0,-MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY,
NULL,0,0 /*加密参数(不加密)*/
);
}else{
err = zipOpenNewFileInZip3_64(
zipfile,
ToUtf8(info.filePath().remove(dir.path())).c_str(), /*在zip文件中的文件路径*/
&zipinfo,
NULL,0,NULL,0,NULL,
0/*Z_DEFLATED*/,Z_NO_COMPRESSION, /*压缩参数(默认参数)*/
0,-MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY,
NULL,0,1 /*加密参数(不加密)*/
);
}
if(err != ZIP_OK){
qDebug()<<info.baseName()<<" "<<err;
continue;
}
QFile file(info.filePath());
if(!file.open(QIODevice::ReadOnly)){
qDebug()<<QString::fromUtf8("OpenFile failed ")<<file.fileName();
zipCloseFileInZip(zipfile);
continue;
}
qint64 filesize = file.size();
for(qint64 rbeg = 0;rbeg<filesize;rbeg+=(4<<20)){
QByteArray buffer = file.read(4<<20);
err = zipWriteInFileInZip(zipfile,buffer.data(),buffer.size());
if(err < 0){
qDebug()<<"error : "<<err;
break;
}
}
zipCloseFileInZip(zipfile);
}
err = zipClose(zipfile,NULL);
if(err < 0){
qDebug()<<"error : "<<err;
}
}
int main(int argc, char *argv[])
{
QTime time;
time.start();
zlib_archive_compress(
QString::fromUtf8("Z:/Everything-SDK/src"),
QString::fromUtf8("Z:/Everything-SDK/srctest.zip"));
int t = time.elapsed();
qDebug()<<"zlib_archive_compress "<<t<<" ms";
return 0;
}
#-------------------------------------------------
#
# Project created by QtCreator 2018-05-23T13:16:36
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
#QMAKE_LFLAGS += -Wl,--enable-stdcall-fixup
SOURCES += main.cpp
INCLUDEPATH += $$PWD/../include
DEPENDPATH += $$PWD/../include
#win32: LIBS += -L$$PWD/zlib/lib/ -lzlib1.lib
win32: LIBS += $$PWD/zlib/lib/zdll1.lib
INCLUDEPATH += $$PWD/zlib/include
DEPENDPATH += $$PWD/zlib/include
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment