Qt|压缩文件夹并设置压缩密码

1,245 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

今天又来更新关于Qt中压缩包的功能啦!

QuaZip环境配置、编译、乱码问题、设置压缩包功能都已经实现了,还差一个功能就可以完美的画个句号了。

上述讲到的QuaZip功能的讲解在这里,有需要的可以自己查看了:

1:Qt编译QuaZip以及程序应用

2:Qt使用QuaZip压缩包中文乱码问题

3:Qt解压带有密码的加密文件

今天的主要讲解重点:使用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++开发程序猿~