Qt|实现解压资源并自动替换功能

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

最近开发的项目中需要这样一个功能:有些客户的工作环境是不需要网络的,那么,我们需要将资源数据以离线的方式操作。

这就涉及了这样一个功能:程序自动进行解压缩功能,并替换旧资源数据

在实现功能过程中,会有以下知识点需要掌握:

1:文件夹遍历功能实现。

2:文件解压缩方法实现。

3:数据读取实现(这里假设读取的是json文件)。

具体的实现流程:

1:获取需存储压缩包文件夹的绝对路径

该路径下可能会存在N个压缩包数据。

压缩包文件夹路径.png

"ZipFiles":代表存储所有的压缩包的文件夹,也就是程序中需要获取的路径。

QString qsFolder = "F:\\ZipFiles";

2:遍历解压压缩包

其实在这个功能中,会有这样的问题需要我们思考:

1:有些文件已经被解压过,有些文件未被解压,该如何区分呢?

2:该文件已经被解压过,又有一个压缩包,此时,需要删除就文件夹,更换成新解压的压缩包数据,该如何处理呢?

首先,拿到压缩包的文件夹后,需要遍历文件夹,采用:QDirIterator

QDirIterator it(qsFolder, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); //遍历所有目录文件
while (it.hasNext())
{
    //有效数据
    QString qsFileName = it.next(); //读取
}
复制代码

qsFileName:是读取的数据路径。

根据该路径,我们需要判断 该路径是文件夹?压缩包?

在Qt中有一个特别方便的方法用于判断文件路径是否为文件夹,代码如下:

QFileInfo info(qsFileName);
if (info.isDir())
{
    //说明:当前是文件夹
}
else
{
    //说明:当前是压缩包文件
    if(info.suffix() != "zip")
    {
        //不是指定压缩包后缀,不进行解压
        continue;
    }
}
复制代码

由此,我们就可以判断出哪些是已经被解析过的数据,哪些是需要解压缩的数据了。

在这里,只需要对压缩包文件进行解压缩处理,文件夹文件是不做该操作的。

对于解压缩操作,之前文章我有进行提过,这里不再详细说明了,有兴趣的可以看下面两个链接:

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

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

到这里,就该解决上面所说的两个问题了,具体操作流程,如下:

1:如果被解压的文件夹已经存在,需要先进行删除。这就保证了解压后的文件一定是最新文件夹,不存在替换功能,防止出错。

2:进行压缩包解压。

3:成功解压后,删除压缩包。

3:数据读取实现

这一步骤功能可以放到步骤二中同步进行,当时文件夹时,直接读取数据,当时压缩包时,先解压后读取数据。

有人又会提到前面步骤2中的第二个问题了,这里最最简单的方式就是让系统来帮我们处理。该如何操作呢?

采用map容器方式进行存储。

文件夹的名称作为key值。在map容器中,如何插入一条相同key值的数据,会将之前存储的value数据进行替换。

这样保证了逻辑的简单性,让系统帮我们存储最新的数据!

如此依赖,根据以上三个步骤,就可以实现解压缩文件并自动替换旧数据功能。

我是中国好公民st,一名C++开发程序猿~

猜你喜欢

转载自juejin.im/post/7108533867329355812
今日推荐