Qt调用adb对嵌入式设备的配置文件进行修改,写入多行内容

之前文章写过Qt调用adb命令来处理嵌入式设备的文件。
Qt开发技巧(二十五)列表窗体的纵向对齐,标签的伙伴部件设置,标签上的超链接操作,子窗体弹出时的坐标问题,Qt在PC端操作设备的方式,Qt用ADB操作设备的文件,Qt防止按钮连续误触

里边描述了如何在PC端的应用程序上调用ADB命令来操作嵌入式设备,基本满足一般的操作需求,但今天碰到一个操作嵌入式设备文件的问题,具体是这样的:

设备中有个配置文件"AppConfig.ini",遵循配置文件的基本写法,内容是:

这没有问题,参考前面文章中的代码,编写函数executeAdbCommand(),使用ADB命令先从设备中将内容读取出来

cpp 复制代码
bool MainWindow::executeAdbCommand(const QString &strCommand, QString &successOut, QString &errOut)
{
    QString adbPath = QCoreApplication::applicationDirPath() + "/adb_platform_tools/adb.exe " + strCommand;

    QProcess process;
    process.start(adbPath);
    bool success = process.waitForFinished(-1);
    if (!success)
    {
        slot_onTipString("命令执行失败!!!", TipState_Danger);
        return false;
    }

    QString output = process.readAllStandardOutput();
    QString error = process.readAllStandardError();

    if (!output.isEmpty())
    {
        successOut = output;
    }

    if (!error.isEmpty())
    {
        errOut = error;
    }

    return true;
}

然后,需求式将原始配置文件中的"AppKey=0"改为"AppKey=1",当然也可能改为其他数值,重新写入嵌入式设备中。但当再用上面的函数executeAdbCommand()函数将内容写入后,发现变成了这样:

cpp 复制代码
//这样试过
    strOldVersion.insert(strOldVersion.indexOf("AppKey"), "\n");
    strOldVersion.replace(strOldVersion.indexOf("AppKey")+7, 1, m_strSetVersion);
    strOldVersion.insert(strOldVersion.indexOf("AppKey")+8, "\n");
    //写入版本号
    slot_onTipString(strCmd, TipState_Danger);
    ret = executeAdbCommand(strCmd);
    
    //这样也试过
    QString strOldVersion = successOut;
    QRegExp regex(" +"); // 匹配一个或多个空格
    strOldVersion = strOldVersion.replace(regex, "\r\n");
    ret = executeAdbCommand(strCmd);
    
//也这样试过
    strCmd.append("IFS='\n' ");
    strCmd.append("echo -e ");
    strCmd.append(strAppVersion);
    strCmd.append(" > /private/usr/Config/AppConfig.ini");
    ret = executeAdbCommand(strCmd);

出来都是这样

"[AppConfig]"和"AppKey=0"变成了空格分隔的一行。

原本的换行符,变成了空格,经过多次尝试依然无效,最后经过不断尝试验证,发现必须要以多个命令的形式去写入,也就是说,每行内容都用一次写入命令,如下:

cpp 复制代码
    QString successOut, errOut;
    int nError = 0;
    bool ret = executeAdbCommand("shell cat '/private/usr/Config/AppConfig.ini' ", successOut, errOut);
    if (!ret || 0 != nError)
    {
        QString strTip = " 获取失败,错误返回:" + QString::number(nError);
        slot_onTipString(strTip, TipState_Danger);
        return;
    }
    slot_onTipString(successOut, TipState_Danger);
    QStringList list = successOut.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
    QString strCmd = "shell ";

    for(int n=0; n<list.size(); n++)
    {
    //判断修改
        if(list.at(n).contains("AppKey"))
        {
            list[n].replace(list.at(n).indexOf("AppKey")+7, 1, m_strSetVersion);
        }
        //每一行制作一个命令
        strCmd.append("echo ");
        strCmd.append(list.at(n));
        if(0 == n)
            strCmd.append(" > /private/usr/Config/AppConfig.ini ;");
        else
            strCmd.append(" >> /private/usr/Config/AppConfig.ini ;");
    }
    //写入版本号
    ret = executeAdbCommand(strCmd);
    if (!ret || 0 != nError)
    {
        QString strTip = " 设置版本失败,错误返回:" + QString::number(nError);
        slot_onTipString(strTip, TipState_Danger);
        return;
    }

如此,ADB命令的形式可以多行写入配置文件到嵌入式设备中。

相关推荐
沉到海底去吧Go31 分钟前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
老纪的技术唠嗑局1 小时前
重剑无锋,大巧不工 —— OceanBase 中的 Nest Loop Join 使用技巧分享
数据库·sql
未来之窗软件服务1 小时前
JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟·东方仙盟数据库
一只爱撸猫的程序猿3 小时前
构建一个简单的智能文档问答系统实例
数据库·spring boot·aigc
nanzhuhe3 小时前
sql中group by使用场景
数据库·sql·数据挖掘
消失在人海中3 小时前
oracle sql 语句 优化方法
数据库·sql·oracle
Clang's Blog3 小时前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
zzc9213 小时前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
未来之窗软件服务3 小时前
JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟数据库
LjQ20404 小时前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫