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();
}
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:Qt软件更新(三) https://www.yhzz.com.cn/a/13821.html