技术专栏
Qt软件更新(三)
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();
}
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
26
3
评论
打赏
- 分享
- 举报
评论
1个
手气红包
相关专栏
-
浏览量:6713次2020-11-25 22:43:12
-
浏览量:10030次2020-11-24 23:33:27
-
浏览量:2658次2017-12-03 14:42:30
-
浏览量:2030次2018-02-01 18:47:33
-
浏览量:2388次2020-08-19 18:24:06
-
浏览量:4750次2020-09-23 22:47:30
-
浏览量:5557次2020-08-23 21:17:12
-
浏览量:2485次2020-02-29 10:14:49
-
浏览量:2529次2022-03-05 09:18:25
-
浏览量:3330次2021-09-30 15:01:23
-
浏览量:1739次2020-05-09 09:32:48
-
浏览量:1795次2020-03-26 10:23:37
-
浏览量:565次2023-08-18 09:40:15
-
浏览量:644次2023-09-18 10:32:50
-
浏览量:4921次2020-09-30 18:03:58
-
浏览量:4970次2021-07-06 15:01:24
-
浏览量:3782次2020-08-21 19:40:26
-
浏览量:2607次2019-12-05 16:39:49
-
浏览量:2360次2020-11-03 14:35:52
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
小王子🤴
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注
写的真好