持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
今天又来更新关于Qt中压缩包的功能啦!
QuaZip环境配置、编译、乱码问题、设置压缩包功能都已经实现了,还差一个功能就可以完美的画个句号了。
上述讲到的QuaZip功能的讲解在这里,有需要的可以自己查看了:
今天的主要讲解重点:使用QuaZip将文件夹压缩成压缩包,并且带有密码
开发环境:VS2017 + Qt5.14.2
压缩文件
实现该功能重点:
1:遍历文件夹中的所有数据,包括:子文件夹、文件。
2:压缩包创建以及文件压缩。
实现重点就两部分,第一个功能很好实现,也是基础功能,难点在于第二个功能的实现,也是咱们文章中的重中之重了。
对外开放接口函数:
/*
参数1:需要被解压的文件夹(绝对路径)
参数2:压缩的路径(绝对路径)
参数3:密码
*/
bool ZipFolder(QString qsFolder, QString qsZipFilePath, const char* chPassword);
1:创建压缩包
使用方法:QuaZip::open
在创建压缩包时,open构造函数中传入的应该是:QuaZip::mdCreate
代表了压缩包以open的方式创建并打开,记得在最后一定要将压缩包关掉哟~
2:遍历文件夹内容查询文件
因为不知道需要打包的文件夹里面嵌套了多少层子文件夹,这里,要想遍历文件夹中的所有内容,此时需要再用递归的方式实现。
设定函数名:TraverseFolderZipFiles
遍历文件夹压缩文件
/*
参数1:需要解析的文件夹路径
参数2:初始文件夹路径,也就是用户传入的文件夹路径
参数3:压缩包创建
参数4:
*/
bool TraverseFolderZipFiles(QString qsFolder, QString qsRootPath, QuaZip& zip, const char* chPassword); //遍历文件夹压缩文件
具体代码实现,如下:
QDir dir(qsFolder);
if (!dir.exists())
{
return false; //不存在,直接返回
}
dir.setSorting(QDir::DirsFirst); //首先是目录,后是文件
//获取qsFolder文件夹下所有的子文件夹
QDirIterator it(qsFolder, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); //遍历所有目录文件
//遍历查询出来的子文件夹
while (it.hasNext()) //有效数据
{
QString filename = it.next(); //路径
QFileInfo fileInfo(filename);
if (fileInfo.isDir())
{
//获取的是文件夹
QString filepath = fileInfo.filePath();
//递归遍历
this->TraverseFolderZipFiles(filepath, qsRootPath, zip, chPassword);
}
else
{
QString qsFilePath = QString("%1/%2").arg(fileInfo.path()).arg(fileInfo.fileName());
QString qsNewRootPath = qsRootPath.replace("\\", "/") + "/";
QString str = qsFilePath;
str.remove(qsNewRootPath);
this->ZipSingleFiles(qsFilePath, str, zip, chPassword);
}
}
该函数的实现思路:
判断该文件夹是否存在?不存在直接退出函数。
查询出来的文件如果是文件夹,说明还需要递归遍历,一直查询到是文件为止。
"ZipSingleFiles"该函数是将一个有效文件写入到压缩包中。
3:压缩包压缩文件
构造一个QuaZipFile实例,父对象是压缩包实例
如果被压缩的文件存在时,将该文件写入到QuaZipFile实例中
调用函数:ZipSingleFiles
具体代码如下:
QuaZipFile outFile(&zip);
QFileInfo file(qsFilePath);
if (file.exists())
{
QFile inFile;
inFile.setFileName(file.filePath());
if (!inFile.open(QIODevice::ReadOnly))
{
return;
}
if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(qsZipFilePath, inFile.fileName()), chPassword))
{
return;
}
outFile.write(inFile.readAll());
outFile.close();
inFile.close();
}
这里需要多说一句的是:QuaZipNewInfo类。
使用QuaZipNewInfo类的作用主要是为了保存在ZIP文档中创建的文件信息。
最后将读取出来的具体文件内容写入到压缩包文件中。这里封装类QuaZip实现加密解密类内部逻辑已经做好了,只需要调用接口就可以实现。
我是中国好公民st,一名C++开发程序猿~