【问题标题】:how to determine if the mount successful in QT codeQT代码如何判断挂载是否成功
【发布时间】:2013-06-19 06:10:30
【问题描述】:

我在安装 smb:// 连接时具有此功能。如果有一个不属于我的情况的错误怎么办。有没有更好的方法来确定挂载是否成功?我使用的是 ubuntu 11.04 和 qt 4.7.3

bool mwDM::mountFolder()
{

QString smbUsername,smbPassword,serverPath,mountPath;
QProcess connectSamba;
QString terminalCommand,linuxPassword;
QDir dir("/mnt/backup");

    smbUsername=ReadINIStr(iniPath,"Server","Username","");
    smbPassword=ReadINIStr(iniPath,"Server","Password","");
    serverPath=ReadINIStr(iniPath,"Server","Hostname","");
    serverPath="//" + serverPath;
    mountPath="/mnt/backup";
    linuxPassword=ReadINIStr(iniPath,"Server","AdminPassword","");
    terminalCommand="echo "+linuxPassword+" | sudo -S mount -t cifs -o username="+smbUsername+",password="+smbPassword+" "+serverPath+ " "+mountPath;

connectSamba.start("sh",QStringList() << "-c" << terminalCommand );
if(!connectSamba.waitForStarted())
{
   LogWrite("Failed to start mount command", Qt::red);
}
if(!connectSamba.waitForFinished() )
{
    LogWrite("Failed to finish mount command", Qt::red);
}

QString connectSamba_stderr = connectSamba.readAllStandardError();
qDebug() << "connectSamba_stderr" << connectSamba_stderr;
if(connectSamba_stderr.contains("is not a valid block device"))
{
    LogWrite("Hostname is invalid", Qt::red);
    return false;
}
else if(connectSamba_stderr.contains("3 incorrect password attempts"))
{

  LogWrite("Admin password is incorrect", Qt::red);
    return false;
}
else if(connectSamba_stderr.contains("wrong fs type, bad option, bad superblock on"))
{
    LogWrite("Hostname is invalid", Qt::red);
    return false;
}
else if(connectSamba_stderr.contains("Invalid argument"))
{

    LogWrite("Mount error(22): Invalid argument", Qt::red);
    return false;
}
else if(!dir.exists())
{
    LogWrite("Directory doesn't exists", Qt::red);
    return false;
}
else
{
    return true;
}

}

【问题讨论】:

    标签: qt samba cifs


    【解决方案1】:

    您可以使用errorstate 函数(Documentation for "error"Documentation for "state")检查QProcess 的最后一个错误。

    “如果出现不属于我的错误怎么办。”

    您可以在代码中添加类似这样的内容:

    else if(connectSamba.state() == QProcess::NotRunning && connectSamba.error() >= 0)
    {
        LogWrite("Unknown error", Qt::red);
        return false;
    }
    

    或者,如果您想提供更具体的信息,您可以分别为每个错误代码创建一个条件。 Here的代码列表。

    或者,不要将上述代码块添加到错误检查代码中。相反,创建一个slot ,您将connect error 信号connectSamba 类:

    // add this line below "QProcess connectSamba;" line in mwDm::mountFolder
    connect(&connectSamba, SIGNAL(error(QProcess::ProcessError)), this, SLOT(onError(QProcess::ProcessError));
    // after that, use your original error checking code in mountFolder
    
    // slot code
    void mwDm::onError(QProcess::ProcessError)
    {
       //use switch-case or if to check type of error if you want
       processErrorOccurred = true; // processErrorOccurred is a member of mwDm
    }
    

    【讨论】:

    • 我可以直接将条件放在connectSamba.error上吗?为什么我需要先放置connectsamba.state?对不起,我使用 qt 1 个月了。
    • @reggie QProcess::Error 中没有NoError 状态,因此您需要检查进程是否未运行。
    • @reggie 添加了一个不检查 connectSamba 状态的替代方法。
    • 在我提出你的条件后,我收到了这个警告:控制到达非空函数的结尾,但你的条件很好,我已经测试过了。我应该注意那个警告吗?
    • 关于 onerror 函数的备用代码我还能使用字符串函数包含吗?
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多