Qt實(shí)現(xiàn)解壓帶有密碼的加密文件
上一章節(jié)中介紹了如何使用Qt編譯quazip庫(kù)以及對(duì)文件加解密的簡(jiǎn)單應(yīng)用,那么,今天我們繼續(xù)深挖關(guān)于解密操作的功能吧!
簡(jiǎn)單的解密一個(gè)壓縮包,可以使用#include "JlCompress.h"
中的函數(shù)進(jìn)行靜態(tài)操作。如果你只是需要簡(jiǎn)單的應(yīng)用那么,這個(gè)文件中的功能就基本可以滿足了。
在我們開(kāi)發(fā)過(guò)程中,為了資料的保密性期間,一般情況下都會(huì)對(duì)壓縮包進(jìn)行加密,那么我們還要使用靜態(tài)函數(shù)的方式進(jìn)行解密那就不支持了。那么,我們?cè)撊绾谓饷軒в忻艽a的加密文件呢?
這也是當(dāng)前文章中的重點(diǎn)啦!
根據(jù)官網(wǎng)上給出的結(jié)果,一般我們會(huì)采取QuaZipFile類來(lái)進(jìn)行非靜態(tài)的解密方式,該方式也支持了帶有密碼的壓縮包文件。
接下來(lái)我來(lái)具體講述該如何實(shí)現(xiàn)帶有密碼的壓縮包解密方法吧!
開(kāi)發(fā)環(huán)境:VS2017 + Qt5.14.2 x64 win10系統(tǒng)
1.指定zip壓縮包狀態(tài)
在我們操作壓縮包的時(shí)候,首先要做的就是指明當(dāng)前是需要壓縮還是解壓縮文件。
當(dāng)前,我們實(shí)現(xiàn)的功能是解壓縮文件,代碼實(shí)現(xiàn)
QuaZip zip(qsZipFiles); zip.open(QuaZip::mdUnzip); //解壓模式打開(kāi)
打開(kāi)Zip文件的方式有以下幾種
枚舉 | 說(shuō)明 |
---|---|
QuaZip::mdNotOpen | ZIP文件沒(méi)有打開(kāi)。這是初始模式 |
QuaZip::mdUnzip | ZIP文件打開(kāi)以讀取里面的文件 |
QuaZip::mdCreate | ZIP文件是通過(guò)open()調(diào)用創(chuàng)建的 |
QuaZip::mdAppend | 以追加方式打開(kāi)ZIP文件 |
QuaZip::mdAdd | ZIP文件被打開(kāi),用于在存檔中添加文件 |
2.創(chuàng)建解壓文件
當(dāng)我們成功打開(kāi)壓縮文件后的第一步需要?jiǎng)?chuàng)建解壓文件,否則解壓的文件無(wú)法存儲(chǔ)。
QString dstPath = qsUnzipFiles; if (!dstPath.endsWith("/") && !dstPath.endsWith("\\")) { dstPath += "/"; } QDir dir(qsUnzipFiles); if (!dir.exists()) { dir.mkpath(qsUnzipFiles); }
3.獲取實(shí)際的壓縮數(shù)量
int nCount = zip.getEntriesCount(); //壓縮實(shí)體數(shù)量
4.遍歷方式創(chuàng)建解壓縮文件
這也是解壓縮文件的重點(diǎn)了。
QuaZip::goToFirstFile
:將當(dāng)前文件設(shè)置為存檔中的第一個(gè)文件
QuaZip::goToNextFile
:將當(dāng)前文件設(shè)置為存檔中的下一個(gè)文件
以for循環(huán)遍歷的方式進(jìn)行查詢,在這里與之前的for循環(huán)不同的是以上兩個(gè)函數(shù)的返回值都是bool值,這里我們也需要遍歷bool值
for (bool suc = zip.goToFirstFile(); suc; suc = zip.goToNextFile()) { //實(shí)際的文件處理 }
這個(gè)文件查找方式是如何操作的呢?
在實(shí)際運(yùn)行過(guò)程中,goToFirstFile函數(shù)會(huì)從當(dāng)前文件夾中的第一個(gè)文件夾進(jìn)行遍歷,一直遍歷到該文件夾下面沒(méi)有子文件為止。然后才會(huì)訪問(wèn)第二個(gè)文件夾。
在for循環(huán)中的實(shí)際處理是如何呢?
4.1設(shè)置解壓文件的參數(shù)
1:設(shè)置壓縮包的名稱
QuaZipFile zipFile; QString qsTempZipName = zip.getZipName(); zipFile.setZipName(qsTempZipName);
2:設(shè)置當(dāng)前需要解壓的文件
QString filename = zip.getCurrentFileName(); zipFile.setFileName(filename);
代碼解析:獲取當(dāng)前正在訪問(wèn)的文件夾,并設(shè)置需要讀取的文件夾名稱
4.2以讀的方式打開(kāi)加密文件
bool bOpen = zipFile.open(QIODevice::ReadOnly, chPassword); if(bOpen == false) return false;
代碼解析:只有在返回值bOpen是true的情況下才代表了讀取成功。
如果返回值是false,在路徑?jīng)]有問(wèn)題的情況下,基本上是密碼錯(cuò)誤。
注意?。?!
在這里需要強(qiáng)烈注意的一點(diǎn)是:輸入的密碼一定是const char*
類型,否則返回值一直是false。這個(gè)坑真的是讓我特別無(wú)語(yǔ)!
4.3獲取當(dāng)前文件的所有內(nèi)容
QByteArray data = zipFile.readAll(); zipFile.close();
使用readAll的方式讀取文件,這個(gè)方法就不再過(guò)多說(shuō)明了,很簡(jiǎn)單,一定要記得,讀取文件之后一定要關(guān)閉文件!
4.4創(chuàng)建解壓縮后的同名文件
if (filename.endsWith("/")) { dir.mkpath(filename); } else { dstFile.setFileName(dstPath + filename); if (!dstFile.open(QIODevice::WriteOnly)) { return false; } dstFile.write(data); dstFile.close(); }
5.關(guān)閉zip壓縮包
zip.close();
這個(gè)操作是一定要有的!
到這里,帶有密碼的壓縮包就可以解壓出來(lái)了!
到此這篇關(guān)于Qt實(shí)現(xiàn)解壓帶有密碼的加密文件的文章就介紹到這了,更多相關(guān)Qt解壓加密文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC實(shí)現(xiàn)Windows多顯示器編程的方法
這篇文章主要介紹了VC實(shí)現(xiàn)Windows多顯示器編程的方法,涉及VC獲取屏幕分辨率及顯示參數(shù)等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的用法介紹
以下是對(duì)C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C++實(shí)現(xiàn)三子棋游戲詳細(xì)介紹(附代碼)
大家好,本篇文章主要講的是C++實(shí)現(xiàn)三子棋游戲詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01C++ 中靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的區(qū)別
這篇文章主要介紹了C++ 中靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-05-05C++學(xué)習(xí)之cstdbool和cstddef頭文件封裝源碼分析
這篇文章主要為大家介紹了C++學(xué)習(xí)之cstdbool和cstddef頭文件封裝源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C語(yǔ)言實(shí)現(xiàn)輸入一個(gè)字符串后打印出該字符串中字符的所有排列
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸入一個(gè)字符串后打印出該字符串中字符的所有排列的方法,是數(shù)學(xué)中非常實(shí)用的排列算法,需要的朋友可以參考下2014-09-09