#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include <QFileDialog>
#include <QDebug>
#include <QFileInfo>
#include "zlib.h"
#include <QFile>
#include "JlCompress.h"
#include "quazip.h"
#include "quazipfile.h"
#include "quazipfileinfo.h"
#include <QCryptographicHash>
#include <QMessageBox>
#include <QDirIterator>
/*
使用时需注意quazip在压缩与解压缩的时候其内的编码方式是根据当前系统的编码方式来弄的,这样子用不同的压缩软件进行压缩,解压中文就可能出现乱码,导致这种乱码的原因就是因为没有指定当前编码方式,如果不是不允许改变源码的情况下,建议手动设置其编码方式可解决乱码问题,做到压缩与解压缩使用相同的编码方式
PS:无论压缩还是解压缩手动设定QuaZip的编码方式为utf-8则中文就不会乱码
QuaZip zip(fileCompressed);
zip.setFileNameCodec(“UTF-8”);
*/
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
//选择要压缩的文件
void Widget::on_btn_chooseFile_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Files"), "/home", tr("Files (*.*)"));
if (fileName.isEmpty())
{
return;
}
ui->lineEdit_zipFile->setText(fileName);
}
//压缩文件保存路径
void Widget::on_btn_zipFilePath_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
"/home",
tr("Zip (*.zip)"));
if (fileName.isEmpty())
{
return;
}
ui->lineEdit_zipFilePath->setText(fileName);
}
//压缩文件
void Widget::on_btn_zip_clicked()
{
//要压缩的文件
QString strzipFile = ui->lineEdit_zipFile->text();
//压缩保存路径
QString strZipSaveFile = ui->lineEdit_zipFilePath->text();
QFileInfo fileSaveInfo(strZipSaveFile);
if (fileSaveInfo.exists())
{
//文件已经存在
return;
}
QFileInfo fileInfo(strzipFile);
if (!fileInfo.exists())
{
return;
}
//取文件
if (fileInfo.isFile())
{
if (ui->checkBox_zipFile->isChecked())
{
zipFileWithPwd();
}
else
{
bool ret = JlCompress::compressFile(fileSaveInfo.absoluteFilePath(), fileInfo.absoluteFilePath());
if (!ret) {
qDebug() << "文件压缩失败...";
}
}
}
}
void Widget::zipFileWithPwd()
{
//要压缩的文件
QString strzipFile = ui->lineEdit_zipFile->text();
//压缩保存路径
QString strZipSaveFile = ui->lineEdit_zipFilePath->text();
QFileInfo fileSaveInfo(strZipSaveFile);
if (fileSaveInfo.exists())
{
//文件已经存在
return;
}
QFileInfo fileInfo(strzipFile);
if (!fileInfo.exists())
{
return;
}
//生成MD5加密
QString strMD5 = QCryptographicHash::hash(QByteArray("123456"), QCryptographicHash::Md5).toHex();
QuaZip newZip(strZipSaveFile);//要生成的zip文件
if (newZip.open(QuaZip::mdCreate))
{
QuaZipFile file(&newZip);
qDebug() << "密码" << strMD5.toUtf8().constData();
QuaZipNewInfo info(fileInfo.fileName());
if (file.open(QIODevice::WriteOnly, info, /*strMD5.toUtf8().constData()*/"123456", 0, 8))
{
QFile fileLocal(strzipFile);
if (fileLocal.open(QIODevice::ReadOnly))
{
file.write(fileLocal.readAll());
fileLocal.close();
}
file.close();
}
newZip.close();
}
}
//选择要解压缩的文件
void Widget::on_btn_unzipFile_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Files"), "/home", tr("Files (*.*)"));
if (fileName.isEmpty())
{
return;
}
ui->lineEdit_unzipFile->setText(fileName);
}
//选择解压文件保存路径
void Widget::on_btn_chooseDir_clicked()
{
QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
"/home",
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
if (dir.isEmpty())
{
return;
}
ui->lineEdit_unzipDir->setText(dir);
}
//解压文件
void Widget::on_btn_unzip_clicked()
{
//解压文件保存路径
QString strUnzipDir = ui->lineEdit_unzipDir->text();
//要解压的文件
QString strzipDir = ui->lineEdit_unzipFile->text();
QFileInfo fileInfo(strzipDir);
if (!fileInfo.exists())
{
return;
}
QDir dir(strUnzipDir);
if (!dir.exists())
{
return;
}
if (fileInfo.suffix() != "zip")
{
return;
}
//解压文件
if (ui->checkBox_unzipFile->isChecked())
{
unZipFileWithPwd();
}
else
{
QStringList list = JlCompress::extractDir(strzipDir, strUnzipDir);
if (list.length() <= 0) {
qDebug() << "文件解压失败...";
return;
}
qDebug() << "list:" << list;
}
}
void Widget::unZipFileWithPwd()
{
//解压文件保存路径
QString strUnzipDir = ui->lineEdit_unzipDir->text();
strUnzipDir += "/";
//要解压的文件
QString strzipDir = ui->lineEdit_unzipFile->text();
QFileInfo fileInfo(strzipDir);
if (!fileInfo.exists())
{
return;
}
QDir dir(strUnzipDir);
if (!dir.exists())
{
return;
}
if (fileInfo.suffix() != "zip")
{
return;
}
QuaZip zip(strzipDir);
zip.open(QuaZip::mdUnzip);//以解压的方式打开
//获取实际压缩数量
int nCount = zip.getEntriesCount();
qDebug()<<"unzip file count = "<<nCount;
for (bool suc = zip.goToFirstFile(); suc; suc = zip.goToNextFile())
{
//实际的文件处理
QuaZipFile zipFile;
QString qsTempZipName = zip.getZipName();
zipFile.setZipName(qsTempZipName);
QString filename = zip.getCurrentFileName();
zipFile.setFileName(filename);
//输入的密码一定是`const char*`类型,否则返回值一直是false
//另:如果用其他压缩软件加密,要选择zip传统加密,这里才能解
bool bOpen = zipFile.open(QIODevice::ReadOnly, "123456");
if (bOpen == false)
{
QMessageBox msgBox;
msgBox.setText(QStringLiteral("密码错误!!!"));
msgBox.exec();
return;
}
//这里可以改为一段一段的读取,以免数据量过大导致出问题
/*
QuaZipFile file(&zip);
for(bool f=zip.goToFirstFile(); f; f=zip.goToNextFile()) {
file.open(QIODevice::ReadOnly, "password"); // put real password here
file.readData(data, maxSize);
// process data from archive
file.close();
}
*/
QByteArray data = zipFile.readAll();
zipFile.close();
if (filename.endsWith("/") || filename.endsWith("\\"))
{
dir.mkpath(filename);
}
else
{
QString strFilePath = strUnzipDir + filename;
QFileInfo tmpFileInfo(strFilePath);
QDir tmpDir(tmpFileInfo.absolutePath());
if (!tmpDir.exists())
{
QString strTmpTxt = tmpFileInfo.absolutePath();
if (!tmpDir.mkpath(tmpFileInfo.absolutePath()))
{
QMessageBox msgBox;
msgBox.setText(QStringLiteral("路径创建失败!!!"));
msgBox.exec();
return;
}