前言:本博文记录采用VS-Qt进行压缩和解压时的VS的配置以及压缩和解压的方法,供其他小伙伴参考。
1. 添加GUI-Private模块,该模块包含Qt的压缩和解压缩方法。
首先在属性页-Qt Project Settings中添加该模块
其次在VC++目录中添加Include文件
C:\Qt\5.15.2\msvc2019_64\include\QtGui\5.15.2\QtGui;
C:\Qt\5.15.2\msvc2019_64\include\QtCore\5.15.2\QtCore;
2. 压缩方法
bool compressData(QFileInfoList fileList, QString basePath, QString SavePath)
{
if (fileList.size() < 1) return false;
QZipWriter* writer = new QZipWriter(SavePath);
for(int i=0; i<fileList.size(); i++)
{
QFileInfo info = fileList.at(i);
QString strFileName = info.fileName();
if (info.fileName() == "." || info.fileName() == "..")
continue;
if (info.isFile())
{
QFile upfile(info.filePath());
upfile.open(QIODevice::ReadOnly);
QString fileName = info.filePath().mid(basePath.size(), info.filePath().size());
writer->addFile(fileName, upfile.readAll());
}
else if (info.isDir())
{
QZipWriterEx(writer, info.filePath(), basePath);
}
}
writer->close();
delete writer;
return true;
}
bool QZipWriterEx(QZipWriter* writer, QString tmpPath, QString basePath)
{
QDir dir(tmpPath);
foreach(QFileInfo info, dir.entryInfoList())
{
if (info.fileName() == "." || info.fileName() == "..")
continue;
if (info.isFile())
{
QFile upfile(info.filePath());
upfile.open(QIODevice::ReadOnly);
std::cout << info.filePath().toStdString() << basePath.size() <<","<< info.filePath().size() << std::endl;
QString fileName = info.filePath().mid(basePath.size(), info.filePath().size());
writer->addFile(fileName, upfile.readAll());
//qDebug() << fileName << tmpPath << basePath;
upfile.close();
}
else if (info.isDir())
{
QZipWriterEx(writer, info.filePath(), basePath);
}
}
return true;
}
3. 解压缩方法
bool decompressData(QString filepath, QString savepath)
{
QDir dir(savepath);
if (!dir.exists())
{
dir.mkpath(savepath);
}
bool unzipok = false;
QZipReader zipreader(filepath);
unzipok = zipreader.extractAll(savepath); //可加可不加没有什么影响
for (int i = 0; i < zipreader.fileInfoList().size(); ++i) {
QStringList paths = zipreader.fileInfoList().at(i).filePath.split("/");
paths.removeLast();
QString path = paths.join("/");
QDir subdir(savepath + "/" + path);
if (!subdir.exists())
dir.mkpath(QString::fromLocal8Bit("%1").arg(savepath + "/" + path));
QFile file(savepath + "/" + zipreader.fileInfoList().at(i).filePath);
file.open(QIODevice::WriteOnly);
//注意编码问题
QByteArray dt = zipreader.fileInfoList().at(i).filePath.toUtf8();
QString strtemp = QString::fromLocal8Bit(dt);
QByteArray array = zipreader.fileData(strtemp);
file.write(array);
file.close();
}
zipreader.close();
return unzipok;
}