您的位置:首页 > 其它

使用Zlib对文件和目录进加密打包和解包

2017-08-23 10:43 1861 查看
   zlib就不做解释了,本人使用的是1.2.7版本,并用C++进行了封装,用到了Qt。

功能:

1.使用线程,不会卡死界面支.

2.支持递归目录,目录和单个文件。

3.可以同时进行多项任务。

4.返回每项任务的任务进度。

5.打包和解包的详细过程信息。

6.支持从包文件中只解压一个文件。

步骤:

1.下载zlib压缩包并解压。

2.找到zlib解压目录下的zlib-1.2.7\contrib\masmx64目录,这里是64位的,32位的目录为zlib-1.2.7\contrib\masmx86。

3.启动vs命令行工具如(VS2013 x64 本机工具命令提示) , 切换到步骤2的目录。

4.将bld_ml64.bat拖到步骤3的命令行工具并执行。

5.执行步骤4后在zlib-1.2.7\contrib目录下找到vstudio目录,然后找到vc10目录下的vs工程文件打开编译生成zlib库。

工程配置就不在啰嗦了, 类SCPackageMgr对每个打包或者解包任务进行管理,SCPackageWorker是实际工作的类,由于打包可能文件很多很大,为了防止界面卡死,所以SCPackageWorker实际是个线程。这里简单的对每一个任务创建了一个线程,其实可以对任务进行分组,每个线程负责一组任务,这就留给读者自己实现了。

头文件:

/*************************************************

Copyright:北京四维(数创)科技有限公司

Author:

Date:2017-08-25

Description:对文件或者目录进行加密打包和解包

**************************************************/

#ifndef SCPACKAGEMGR_H

#define SCPACKAGEMGR_H

#include <QObject>

#include <QVector>

#include <QThread>

#ifdef _WIN64

#define ZLIB_WINAPI

#endif

#include "unzip.h"

#include "zip.h"

class SCPackageWorker;

class QThread;

typedef QVector<QString> FileList;

typedef QVector<QString> DirList;

typedef QVector<SCPackageWorker *> TaskList;

class SCPackageMgr: public QObject

{

Q_OBJECT

public:

static SCPackageMgr&instance();

/*************************************************

Function:       addDir

Description:    添加要打包的目录

Input:          dir,需要打包的目录

Output:         无

Return:         void

*************************************************/

void addDir(const QString &dir);

/*************************************************

Function:       addFile

Description:    添加要打包的文件

Input:          path,需要打包的文件完整路径

Output:         无

Return:         void

*************************************************/

void addFile(const QString &path);

/*************************************************

Function:        package

Description:     开始打包, 打包addDir和addFile添加的文件和文件夹

Input:           packagePath,打包后的文件完整路径如F:\1.zip

Input:           passWord,对打包文件进行加密的密码

Input:           level,压缩级别(0-9), 默认为9

Output:          无

Return:         void

*************************************************/

void package(const QString &packagePath, const QString &passWord = "", int level = 9);

/*************************************************

Function:        unPackage

Description:     解包一个压缩包

Input:           strPackageFilePath,需要解包的文件路径

Input:           strUnPackageDir,解压目录

Input:           password,密码对应package打包的密码

Output:          无

Return:         void

*************************************************/

void unPackage(const QString &strPackageFilePath, const QString &strUnPackageDir, const QString &password="");

/*************************************************

Function:        unPackFileFromPackge

Description:     解包压缩包中特定的一个文件

Input:           strPackageFilePath,需要解包的文件路径

Input:           strUnPackageDir,解压目录

Input:           password,密码对应package打包的密码

Input:           fileNameInPackage,该文件在包中的名称

Output:          无

Return:         void

*************************************************/

void unPackFileFromPackge(const QString &strPackageFilePath,

const QString &strUnPackageDir,

const QString &fileNameInPackage,

const QString &password = "");

/*************************************************

Function:        clear

Description:     清空当前需要打包的内容,为下一次打包做准备, 每次新添加目录或者文件调用

Input:           无

Output:          无

Return:         void

*************************************************/

void clear();

private:

SCPackageMgr();

SCPackageMgr(const SCPackageMgr&){}

~SCPackageMgr();

SCPackageMgr &operator =(const SCPackageMgr &){}

signals:

/*************************************************

Function:        packageProgress

Description:     通知打包的进度

Output:          filePath,打包的目录对应package参数1传入的文件路径

Output:          progress,进度。

Return:         void

*************************************************/

void packageProgress(const QString &filePath, const QString& progress);

/*************************************************

Function:        unPackageProgress

Description:     通知解包的进度

Output:          filePath,解包的目录对应unPackage参数1传入的文件路径

Output:          progress,进度。

Return:         void

*************************************************/

void unPackageProgress(const QString &filePath, const QString& progress);

/*************************************************

Function:        progressInfo

Description:     解包或者打包的详细信息,如当前正在对某个文件压缩

Output:          info,信息

Return:         void

*************************************************/

void progressInfo(const QString &info);

private:

//任务列表

TaskList m_tasks;

//需要打包的文件列表

FileList m_files;

//需要打包的目录列表

DirList m_dirs;

};

class SCPackageWorker : public QThread

{

Q_OBJECT

enum WorkerType

{

PACKAGE_TYPE = 1,

UNPACKAGE_TYPE,

UNPACKAGE_ONE_TYPE

};

private:

/*************************************************

Function:        package

Description:     开始打包, 打包addDir和addFile添加的文件和文件夹

Input:           packagePath,打包后的文件完整路径如F:\1.zip

Input:           passWord,对打包文件进行加密的密码

Input:           level,压缩级别(0-9), 默认为9

Output:          无

Return:         void

*************************************************/

void package(const QString &packagePath, const QString &passWord, int level = 9);

/*************************************************

Function:        unPackage

Description:     解包一个压缩包

Input:           strPackageFilePath,需要解包的文件路径

Input:           strUnPackageDir,解压目录

Input:           password,密码对应package打包的密码

Output:          无

Return:         void

*************************************************/

void unPackage(const QString &strPackageFilePath, const QString &strUnPackageDir, const QString &password);

/*************************************************

Function:        unPackFileFromPackge

Description:     解包压缩包中特定的一个文件

Input:           strPackageFilePath,需要解包的文件路径

Input:           strUnPackageDir,解压目录

Input:           password,密码对应package打包的密码

Input:           fileNameInPackage,该文件在包中的名称

Output:          无

Return:         void

*************************************************/

void unPackFileFromPackge(const QString &strPackageFilePath,

const QString &strUnPackageDir,

const QString &fileNameInPackage,

const QString &password);

private:

void run();

SCPackageWorker(){}

SCPackageWorker(const FileList &fileList, const DirList &dirList);

SCPackageWorker(const SCPackageWorker&){}

~SCPackageWorker(){}

SCPackageWorker &operator =(const SCPackageWorker &){}

/*************************************************

Function:        packageByDir

Description:     对指定目录进行递归打包

Input:           strPath,需要打包的目录

Input:           parentDir,父目录

Input:           password,密码

Input:           level,压缩级别

Output:          无

Return:         void

*************************************************/

void packageByDir(zipFile zf, const QString& strPath, const QString& parentDir, const QString &passWord, int level);

/*************************************************

Function:        packageByFile

Description:     对指定文件行打包

Input:           fileNameInPackage,指定打包的文件在包文件的名称

Input:           filePath,需要打包文件的完整路径

Input:           password,密码

Input:           level,压缩级别

Output:          无

Return:         void

*************************************************/

void packageByFile(zipFile zf,  const QString &fileNameInPackage, const QString &filePath, const QString &passWord, int level);

/*************************************************

Function:        getDirFileCount

Description:     获取目录下的文件个数

Input:           dir,需要计算的目录

Input:           count,文件个数

Output:          无

Return:         void

*************************************************/

void getDirFileCount(const QString &dir, int &count);

/*************************************************

Function:        startPackage

Description:     开始打包

Input:           无

Output:          无

Return:         void

*************************************************/

void startPackage();

/*************************************************

Function:        startUnPackage

Description:     开始解包

Input:           无

Output:          无

Return:         void

*************************************************/

void startUnPackage();

/*************************************************

Function:        startUnPacgeOne

Description:     解包一个

Input:           无

Output:          无

Return:         void

*************************************************/

void startUnPacgeOne();

signals:

/*************************************************

Function:        packageProgress

Description:     通知打包的进度

Output:          filePath,打包的目录对应package参数1传入的文件路径

Output:          progress,进度。

Return:         void

*************************************************/

void packageProgress(const QString &filePath, const QString& progress);

/*************************************************

Function:        unPackageProgress

Description:     通知解包的进度

Output:          filePath,解包的目录对应unPackage参数1传入的文件路径

Output:          progress,进度。

Return:         void

*************************************************/

void unPackageProgress(const QString &filePath, const QString& progress);

/*************************************************

Function:        progressInfo

Description:     解包或者打包的详细信息,如当前正在对某个文件压缩

Output:          info,信息

Return:         void

*************************************************/

void progressInfo(const QString &info);

private:

//需要打包的文件列表

FileList m_files;

//需要打包的目录列表

DirList m_dirs;

//打包或者解包的文件路径,用于进度信号发出

QString m_strPackageFilePath;

QString m_strUnPackageFilePath;

QString m_strUnPackageDir;

QString m_strPw;

int m_nlevel;

//要解压的单个文件名

QString m_strUnPackageOneFileName;

//上一次进度

QString m_strLastProgress;

//打包文件总个数

int m_nTasks;

//打包一个文件所占%

double m_nProgerss;

//打包次数

int m_nLoopCount;

//解压打包

WorkerType m_WorkerType;

friend class SCPackageMgr;

};

#endif // SCPACKAGEMGR_H

源文件:

#include "SCPackageMgr.h"
#include <qt_windows.h>
#include <QDebug>
#include <QDir>
#include <QThread>
#include <iostream>
#include <fstream>
using namespace std;
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
#define WRITEBUFFERSIZE (8192)
void SCPackageMgr::clear()
{
m_dirs.clear();
m_files.clear();
}
SCPackageMgr &SCPackageMgr::instance()
{
static SCPackageMgr mgr;
return mgr;
}
void SCPackageMgr::addDir(const QString &dir)
{
m_dirs.push_back(dir);
}
void SCPackageMgr::addFile(const QString &path)
{
m_files.push_back(path);
}
void SCPackageMgr::package(const QString &packagePath, const QString &passWord, int level)
{
SCPackageWorker *worker = new SCPackageWorker(m_files, m_dirs);
connect(worker, SIGNAL(packageProgress(const QString&,const QString&)), this, SIGNAL(packageProgress(const QString&,const QString&)));
worker->package(packagePath, passWord, level);
m_tasks.push_back(worker);
}
void SCPackageMgr::unPackage(const QString &strPackageFilePath, const QString &strUnPackageDir, const QString &password)
{
SCPackageWorker *worker = new SCPackageWorker();
connect(worker, SIGNAL(unPackageProgress(const QString&,const QString&)), this, SIGNAL(unPackageProgress(const QString&,const QString&)));
worker->unPackage(strPackageFilePath, strUnPackageDir, password);
m_tasks.push_back(worker);
}
void SCPackageMgr::unPackFileFromPackge(const QString &strPackageFilePath, const QString &strUnPackageDir, const QString &fileNameInPackage, const QString &password)
{
SCPackageWorker *worker = new SCPackageWorker();
connect(worker, SIGNAL(unPackageProgress(const QString&,const QString&)), this, SIGNAL(unPackageProgress(const QString&,const QString&)));
worker->unPackFileFromPackge(strPackageFilePath, strUnPackageDir, fileNameInPackage, password);
m_tasks.push_back(worker);
}
SCPackageMgr::SCPackageMgr()
{
}
SCPackageMgr::~SCPackageMgr()
{
foreach (SCPackageWorker *worker, m_tasks) {
if(NULL != worker){
worker->quit();
delete worker;
worker = NULL;
}
}
}
void SCPackageWorker::package(const QString &packagePath, const QString &passWord, int level )
{
m_WorkerType = PACKAGE_TYPE;
m_strPackageFilePath = packagePath;
m_strPw = passWord;
m_nlevel = level;
start();
}
void SCPackageWorker::unPackage(const QString &strPackageFilePath, const QString &strUnPackageDir, const QString &password)
{
m_WorkerType = UNPACKAGE_TYPE;
m_strPackageFilePath = strPackageFilePath;
m_strUnPackageDir = strUnPackageDir;
m_strPw = password;
 start();
}
void SCPackageWorker::unPackFileFromPackge(const QString &strPackageFilePath,
          const QString &strUnPackageDir,
          const QString &fileNameInPackage,
const QString &password)
{
m_WorkerType = UNPACKAGE_ONE_TYPE;
m_strPackageFilePath = strPackageFilePath;
m_strUnPackageDir = strUnPackageDir;
m_strUnPackageOneFileName = fileNameInPackage;
m_strPw = password;
start();
}
void SCPackageWorker::run()
{
switch (m_WorkerType) {
case PACKAGE_TYPE:
startPackage();
break;
case UNPACKAGE_TYPE:
startUnPackage();
break;
case UNPACKAGE_ONE_TYPE:
startUnPacgeOne();
break;
default:
break;
}
}
SCPackageWorker::SCPackageWorker(const FileList &fileList, const DirList &dirList)
{
m_dirs = dirList;
m_files = fileList;
}
void SCPackageWorker::packageByDir(zipFile zf, const QString &strPath, const QString &parentDir, const QString &passWord, int level)
{
QString strRelativePath;
QDir dir(strPath);
foreach(QFileInfo mfi , dir.entryInfoList())
{
if(mfi.fileName()=="." || mfi.fileName() == "..")
continue;
if (parentDir == "")
strRelativePath = mfi.fileName();
else
strRelativePath = parentDir + "/" + mfi.fileName(); //生成在zip文件中的相对路径
if(mfi.isFile())
 {
packageByFile(zf, strRelativePath, mfi.filePath(), passWord, level);
 }
else
 {
packageByFile(zf, strRelativePath, NULL, passWord, level);
emit progressInfo(QString::fromLocal8Bit("正在打包目录:")+strRelativePath);
packageByDir(zf, mfi.filePath(), strRelativePath, passWord, level); //递归收集子目录文件
 }
}
}
void SCPackageWorker::packageByFile(zipFile zf,  const QString &fileNameInPackage, const QString &filePath, const QString &passWord, int level)
{
FILE* srcfp = NULL;
//初始化写入zip的文件信息
zip_fileinfo zi;
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;
//如果srcFile为空,加入空目录
char new_file_name[MAX_PATH];
memset(new_file_name, 0, sizeof(new_file_name));
strcat(new_file_name, fileNameInPackage.toLocal8Bit().data());
if (filePath.isEmpty())
  {
strcat(new_file_name, "/");
  }
//在zip文件中创建新文件
zipOpenNewFileInZip3_64(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, level, 0, -MAX_WBITS, DEF_MEM_LEVEL,
Z_DEFAULT_STRATEGY, passWord.toLocal8Bit().data(), 0, 0);
//zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
if (!filePath.isEmpty())
  {
//打开源文件
srcfp = fopen(filePath.toLocal8Bit().data(), "rb");
if (srcfp == NULL)
   {
zipCloseFileInZip(zf); //关闭zip文件
return;
  }
//读入源文件并写入zip文件
char buf[100*1024]; //buffer
int numBytes = 0;
while( !feof(srcfp) )
   {
numBytes = fread(buf, 1, sizeof(buf), srcfp);
zipWriteInFileInZip(zf, buf, numBytes);
if( ferror(srcfp) )
  break;
  }
//关闭源文件
fclose(srcfp);
  }
//关闭zip文件
//zipCloseFileInZip(zf);
QString currentProgress = QString::number(qMax(1, qMin(100*(++m_nLoopCount)/m_nTasks, 99)));
if(m_strLastProgress != currentProgress)
{
emit packageProgress(m_strPackageFilePath,  currentProgress);
m_strLastProgress = currentProgress;
}
emit progressInfo(QString::fromLocal8Bit("正在打包文件:")+new_file_name);
}
void SCPackageWorker::getDirFileCount(const QString &dirPath, int &count)
{
if(dirPath.isEmpty())
return;
QDir dir(dirPath);
  foreach(QFileInfo mfi , dir.entryInfoList())
 {
  if(mfi.isFile())
{
count++;
}else
{
      if(mfi.fileName()=="." || mfi.fileName() == "..")
    continue;
getDirFileCount(mfi.absoluteFilePath(), count);
}
 }
}
void SCPackageWorker::startPackage()
{
if(m_dirs.count() == 0 && m_files.count() == 0)
return;
zipFile newZipFile = zipOpen(m_strPackageFilePath.toLocal8Bit().data(), APPEND_STATUS_CREATE); //创建zip文件
if (newZipFile == NULL)
{
emit progressInfo(QString::fromLocal8Bit("创建打包文件失败:")+m_strPackageFilePath);
return ;
}
//总任务量
m_nTasks = m_files.count();
//emit packageProgress(m_strPackageFilePath, QString::fromLocal8Bit("正在计算文件个数....."));
foreach (const QString path, m_dirs) {
getDirFileCount(path, m_nTasks);
}
//完成一个任务占用的%
m_nLoopCount = 0;
//打包文件夹
foreach (const QString dir, m_dirs) {
packageByDir(newZipFile, dir, "", m_strPw, m_nlevel);
}
//打包文件
foreach (const QString path, m_files) {
QFileInfo fileInfo(path);
packageByFile(newZipFile, fileInfo.fileName(), fileInfo.filePath(), m_strPw, m_nlevel);
}
//关闭zip文件
emit packageProgress(m_strPackageFilePath, "100");
zipCloseFileInZip(newZipFile);
zipClose(newZipFile, NULL); //关闭zip文件
}
void SCPackageWorker::startUnPacgeOne()
{
//打开
unzFile zFile = unzOpen64(m_strPackageFilePath.toLocal8Bit().data());
if (zFile == NULL)
 {
qDebug()<<QString::fromLocal8Bit("文件打开失败")<<m_strPackageFilePath;
 return ;
 }
//定位文件
int err = unzLocateFile(zFile, m_strUnPackageOneFileName.toLocal8Bit().data(), 0);
if (UNZ_OK != err)
 {
qDebug() << "unzLocateFile failed!err:" << err;
 return ;
 }
//获取当前文件信息
unsigned int BufSize = 512;
char *szFileName_WithPath = new char[BufSize];
unz_file_info zFileInfo;
if (UNZ_OK != unzGetCurrentFileInfo(zFile, &zFileInfo, szFileName_WithPath, BufSize, NULL, 0, NULL, 0))
 {
qDebug()<<QString::fromLocal8Bit("获取文件信息失败");
 return;
 }
//打开当前文件
if (UNZ_OK != unzOpenCurrentFile(zFile))
 {
qDebug()<<QString::fromLocal8Bit("打开当前文件失败");
 return;
 }
//定义一个fstream对象,用来写入文件
QString strFileName = m_strUnPackageDir+"\\"+m_strUnPackageOneFileName;
fstream file;
file.open(strFileName.toLocal8Bit().data(), ios_base::out | ios_base::binary);
//解压文件,到fileData中
unsigned char* fileData = new unsigned char[zFileInfo.uncompressed_size];
memset(fileData , 0,zFileInfo.uncompressed_size);
err = unzReadCurrentFile(zFile, (voidp)fileData, zFileInfo.uncompressed_size);
if (err < 0)
 {
qDebug()<<QString::fromLocal8Bit("读取文件信息失败");
 return;
 }
//写入文件
file.write((const char *)fileData, zFileInfo.uncompressed_size);
file.close();
unzClose(zFile);
//释放资源
delete[] szFileName_WithPath;
szFileName_WithPath = NULL;
delete[] fileData;
fileData = NULL;
}
void SCPackageWorker::startUnPackage()
{
int nReturnValue;
//打开zip文件
unzFile unzfile = unzOpen64(m_strPackageFilePath.toLocal8Bit().data());
if (unzfile == NULL)
{
emit progressInfo(QString::fromLocal8Bit("打开文件失败:")+m_strPackageFilePath);
return;
}
//获取zip文件的信息
unz_global_info64* pGlobalInfo = new unz_global_info64;
nReturnValue = unzGetGlobalInfo64(unzfile, pGlobalInfo);
if (nReturnValue != UNZ_OK)
{
emit progressInfo(QString::fromLocal8Bit("获取打包文件信息失败:")+m_strPackageFilePath);
return;
}
//解析zip文件
unz_file_info64* pFileInfo = new unz_file_info64;
char szZipFName[MAX_PATH];
//任务总量
int nTasks = pGlobalInfo->number_entry;
//完成一个任务占用的%
//存放从zip中解析出来的内部文件名
for (int i = 0; i<nTasks; i++)
{
//解析得到zip中的文件信息
nReturnValue = unzGetCurrentFileInfo64(unzfile, pFileInfo, szZipFName, MAX_PATH,
NULL, 0, NULL, 0);
    if (nReturnValue != UNZ_OK)
 {
emit progressInfo(QString::fromLocal8Bit("获取文件信息失败:")+szZipFName);
    return;
}
qDebug()<<szZipFName;
//判断是文件夹还是文件
if(QString(szZipFName).right(1) == "/")
 {
QString strDiskPath = m_strUnPackageDir+ "/" + szZipFName;
strDiskPath = strDiskPath.replace("/", "\\");
CreateDirectoryA(strDiskPath.toLocal8Bit().data(), NULL);
emit progressInfo(QString::fromLocal8Bit("正在创建目录:")+strDiskPath);
}
   else
 {
//创建文件
QString strDiskFile = m_strUnPackageDir + "/";
strDiskFile += szZipFName;
strDiskFile = strDiskFile.replace("\\", "/");
HANDLE hFile = CreateFile(strDiskFile.toStdWString().c_str(), GENERIC_WRITE,
0, NULL, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
emit progressInfo(QString::fromLocal8Bit("创建文件失败:")+strDiskFile);
qDebug()<<QString::fromLocal8Bit("创建文件失败:")+strDiskFile;
  return;
}
       //打开文件
nReturnValue = unzOpenCurrentFilePassword(unzfile, m_strPw.toLocal8Bit().data());
if (nReturnValue != UNZ_OK)
{
emit progressInfo(QString::fromLocal8Bit("密码错误,解密文件失败:")+strDiskFile);
CloseHandle(hFile);
  return;
}
//读取文件
const int BUFFER_SIZE = 4096;
char szReadBuffer[BUFFER_SIZE];
emit progressInfo(QString::fromLocal8Bit("正在写入文件内容"));
while (TRUE)
{
memset(szReadBuffer, 0, BUFFER_SIZE);
int nReadFileSize = unzReadCurrentFile(unzfile, szReadBuffer, BUFFER_SIZE);
                if (nReadFileSize < 0)    //读取文件失败
{
unzCloseCurrentFile(unzfile);
    CloseHandle(hFile);
      return;
}
      else if (nReadFileSize == 0)//读取文件完毕
{
unzCloseCurrentFile(unzfile);
    CloseHandle(hFile);
    break;
}
      else                                //写入读取的内容
{
DWORD dWrite = 0;
BOOL bWriteSuccessed = WriteFile(hFile, szReadBuffer, BUFFER_SIZE, &dWrite, NULL);
if (!bWriteSuccessed)
   {
    unzCloseCurrentFile(unzfile);
        CloseHandle(hFile);
  return;
 }
}
}
emit progressInfo(QString::fromLocal8Bit("文件创建完成"));
}
unzGoToNextFile(unzfile);
QString currentProgress = QString::number(qMax(1, qMin(100*(i+1)/nTasks, 99)));
    if(m_strLastProgress != currentProgress)
 {
emit unPackageProgress(m_strPackageFilePath,  currentProgress);
    m_strLastProgress = currentProgress;
}
}
//关闭
if (unzfile)
{
unzClose(unzfile);
}
emit unPackageProgress(m_strPackageFilePath, "100");
}


使用方法:

进度获取:连接信号即可

connect(&SCPackageMgr::instance(),SIGNAL(packageProgress(constQString&,constQString&)),this,SLOT(slotPackageProgress(constQString&,constQString&)));

connect(&SCPackageMgr::instance(),SIGNAL(unPackageProgress(QString,QString)),this,SLOT(slotUnPackageProgress(constQString&,constQString&)));

打包:

//任务一

SCPackageMgr::instance().addDir("F:\\SCEarthEngine");

SCPackageMgr::instance().addFile("F:\\Observer.h");

SCPackageMgr::instance().package("F:\\1.zip", "123456", 5);

//任务二

SCPackageMgr::instance().clear();

SCPackageMgr::instance().addDir("F:\\ScEarthEngineDAI");

SCPackageMgr::instance().package("F:\\3.zip", "123456", 5);

//任务=三

  SCPackageMgr::instance().clear();

SCPackageMgr::instance().addDir("F:\\VisualizationsEngine");

SCPackageMgr::instance().package("F:\\2.zip", "123456", 5);


解包

SCPackageMgr::instance().unPackage("f:\\1.zip","f:\\test","123456");

从包中解压一个文件:

SCPackageMgr::instance().unPackFileFromPackge("f:\\1.zip","f:\\test","Observer.h","");

源码中使用了C/C++相关方法实现文件的读写,可以换成Qt相关的类进行,我比较懒没改,没有整理,创建目录都使用的windows函数。有疑问可以交流。

类文件下载地址:http://pan.baidu.com/s/1bYWRee  密码:s344
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: