使用zlib库进行目录压缩

代码很简单,具体过程就不写了。
关于加密压缩,可以看http://www.zlib.net/zlib_faq.html#faq38 中的描述,默认是不支持的。

#include "zlib.h"
#include "zip.h"
#ifdef _WIN32
#define USEWIN32IOAPI
#include "iowin32.h"
#endif

#include <QFile>
#include <QDir>
#include <QDateTime>

/*转换Qstring到utf8字符串*/
inline std::string ToUtf8(const QString& str)
{
    QByteArray u8 = str.toUtf8();
    return std::string(u8.data(),u8.size());
}

// zlib打包压缩测试
void zlib_archive_compress()
{
    QDir dir(QString::fromLocal8Bit("Z:/Everything-SDK/src"));
    QStringList entrylist = dir.entryList();
    qDebug()<<entrylist;

    int err = 0;
    zipFile zipfile;
#ifdef _WIN32
    zlib_filefunc64_def ffunc64;
    fill_win32_filefunc64W(&ffunc64);
    wchar_t* path = L"Z:/Everything-SDK/testsrc.zip";
    zipfile = zipOpen2_64(path,APPEND_STATUS_CREATE,NULL,&ffunc64);
#else
    zipfile = zipOpen64("Z:/Everything-SDK/testsrc.zip",APPEND_STATUS_CREATE);
#endif
    if(zipfile == NULL){
        qDebug()<<ZIP_ERRNO;
        return;
    }
    
    // 逐个文件添加
    for(int i=2;i<entrylist.size();++i){
        QFileInfo info(dir.path() + QChar('/') + 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;
        
        // 在zip包中打开一个新文件
        err = zipOpenNewFileInZip3_64(
                    zipfile,
                    ToUtf8(QString::fromAscii("src/") +  info.fileName()).c_str(), /*在zip文件中的文件路径(我这里使用UTF8,可以根据需求自己抉择)*/
                    &zipinfo,
                    NULL,0,NULL,0,NULL,
                    Z_DEFLATED,Z_DEFAULT_COMPRESSION, /*压缩参数(默认参数)*/
                    0,-MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY,
                    NULL,0,0 /*加密参数(不加密)*/
                    );
       // 在zip包中添加新文件失败
        if(err != ZIP_OK){
            qDebug()<<QString::fromAscii("zipOpenNewFileInZip3_64 failed  ")<<err;
            zipCloseFileInZip(zipfile);
           break;
        }
        QFile file(info.filePath());
        if(!file.open(QIODevice::ReadOnly)){
            qDebug()<<QString::fromAscii("OpenFile failed  ")<<file.fileName();
            zipCloseFileInZip(zipfile);
            continue;
        }
        // 读取文件内容,写入zip包文件
        QByteArray buffer = file.readAll();
        err = zipWriteInFileInZip(zipfile,buffer.data(),buffer.size());
        if(err < 0){
            qDebug()<<"error : "<<err;
        }
        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();
    int t = time.elapsed();
    qDebug()<<t<<" ms";
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/oloroso/p/9144776.html