技术专栏
Qt软件更新(三)
这篇文章介绍软件在线更新的最后一部分“更新程序”。 实现功能:
- 复制更新内容到程序目录
- 删除更新目录
- 重启软件
#ifndef INSTALL_H
#define INSTALL_H
#include <QObject>
#include <QProcess>
class install : public QObject
{
Q_OBJECT
public:
explicit install(QObject *parent = nullptr);
signals:
void updateText(QString text);
public slots:
void startInstall(QStringList info);
private:
bool cpDir(const QString &srcPath, const QString &dstPath);
void clearTempFiles(const QString& temp_path);
QProcess *process = nullptr;
};
#endif // INSTALL_H
#include "install.h"
#include <QDir>
#include <QtDebug>
#include <QSettings>
#include <QTimer>
#include <QApplication>
#include <QDirIterator>
install::install(QObject *parent) : QObject(parent)
{
process = new QProcess(this);
}
void install::startInstall(QStringList info)
{
QString srcPath = info.at(1);
QString dstPath = QDir::currentPath();
qDebug() << "install::startInstall ::" << srcPath;
cpDir(srcPath,dstPath);
QDir(srcPath).removeRecursively();
QString iniFilePath = QDir::currentPath() + "/config.ini";
QSettings settings(iniFilePath,QSettings::IniFormat);
settings.beginGroup("VersionDate");
settings.setValue("time", info.at(0));
// QTimer::singleShot(2000,this,[=](){
emit updateText(QString::fromLocal8Bit("软件更新成功,将启动iLabV12"));
// QTimer::singleShot(2000,this,[=](){
process->setProcessChannelMode(QProcess::MergedChannels);
QString exe = QDir::currentPath() + "/iLabV12.exe";
QDir::setCurrent(exe);
qDebug() << "start exe:" << exe;
// process->startDetached("iLabV12.exe");
if (!process->startDetached("iLabV12.exe")) {
qDebug() << "start failed:" << process->errorString();
emit updateText(QString::fromLocal8Bit("启动iLabV12失败请手动开启"));
} else {
qDebug() << "start success";
QApplication::quit();
}
// });
// });
}
bool install::cpDir(const QString &srcPath, const QString &dstPath)
{
if(srcPath.isEmpty() || dstPath.isEmpty())
return false;
QDir srcDir(srcPath);
foreach(const QFileInfo &info, srcDir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)){
QString srcItemPath = srcPath + "/" + info.fileName();
QString dstItemPath = dstPath + "/" + info.fileName();
if(info.isDir()){
QDir dir;
if (!dir.exists(dstItemPath))
{
bool res = dir.mkpath(dstItemPath);
if(!res)
qDebug() << "mkpath error:" << res;
}
if(!cpDir(srcItemPath, dstItemPath)){
return false;
}
}
else if(info.isFile()){
if(QFile(dstItemPath).exists())
{
QFileInfo f(dstItemPath);
f.dir().remove(f.fileName());
}
if(!QFile::copy(srcItemPath, dstItemPath)){
return false;
}
}
else{
qDebug() << "Unhandled item" << info.filePath() << "in cpDir";
}
}
return true;
}
void install::clearTempFiles(const QString& temp_path)
{
QDir Dir(temp_path);
if(Dir.isEmpty())
{
return;
}
// 第三个参数是QDir的过滤参数,这三个表示收集所有文件和目录,且不包含"."和".."目录。
// 因为只需要遍历第一层即可,所以第四个参数填QDirIterator::NoIteratorFlags
QDirIterator DirsIterator(temp_path, QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
while(DirsIterator.hasNext())
{
if (!Dir.remove(DirsIterator.next())) // 删除文件操作如果返回否,那它就是目录
{
QDir(DirsIterator.filePath()).removeRecursively(); // 删除目录本身以及它下属所有的文件及目录
}
}
Dir.removeRecursively();
}
*本文仅代表作者观点,不代表易百纳技术社区立场。系作者授权易百纳技术社区发表,未经许可不得转载。
精彩评论
-
赞0
最新专栏
自媒体

Opencv双目视觉

海思讨论群
联系我们


打赏
打赏作者

小王子🤴
您的支持将鼓励我继续创作!
金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
支付宝支付

写的真好