之前文章写过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命令的形式可以多行写入配置文件到嵌入式设备中。