-
-
Save sotex/517b8b7d72dfde364447d02bc8c8a815 to your computer and use it in GitHub Desktop.
使用zlib库将一个目录下所有文件打包为一个zip压缩包
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#------------------------------------------------- | |
# | |
# 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