QDir mkpath返回true,但未创建目录

时间:2019-06-04 17:32:45

标签: c++ qt

我在Linux上使用Qt创建路径时遇到了一个奇怪的问题。我编写了一个独立的测试程序,该程序创建路径和测试它们的存在。这样可以正常工作并创建目录。

/* make path */
QString p("/usr2/archive/S1234ABC/5/6");
QDir d;
if (d.mkpath(p)) qDebug() << "mkpath() returned true";
else qDebug() << "mkpath() returned false";

QDir d2;
if (d2.exists(p)) qDebug() << "exists() returned true";
else qDebug() << "exists() returned false";

在另一个项目中,我将该测试示例转换为更强大的功能。但这不起作用... mkpath()和exist()返回true,但是硬盘上不存在路径。

bool nidb::MakePath(QString p, QString &msg) {

    if ((p == "") || (p == ".") || (p == "..") || (p == "/") || (p.contains("//")) || (p == "/root") || (p == "/home")) {
        msg = "Path is not valid [" + p + "]";
        return false;
    }

    WriteLog("MakePath() called with path ["+p+"]");
    QDir path;
    if (path.mkpath(p)) {
        WriteLog("MakePath() mkpath returned true [" + p + "]");
        if (path.exists()) {
            WriteLog("MakePath() Path exists [" + p + "]");
            msg = QString("Destination path [" + p + "] created");
        }
        else {
            WriteLog("MakePath() Path does not exist [" + p + "]");
            msg = QString("Unable to create destination path [" + p + "]");
            return false;
        }
    }
    else {
        msg = QString("MakePath() mkpath returned false [" + p + "]");
        return false;
    }
    return true;
}

我的程序的输出:

[2019/06/04 13:19:37][26034] MakePath() called with path [/usr2/archive/S0836VYL/6/5/dicom]
[2019/06/04 13:19:37][26034] MakePath() mkpath returned true [/usr2/archive/S0836VYL/6/5/dicom]
[2019/06/04 13:19:37][26034] MakePath() Path exists [/usr2/archive/S0836VYL/6/5/dicom]

以及命令行的输出...

[onrc@ado2dev /]$ cd /usr2/archive/S0836VYL/6/5/dicom
-bash: cd: /usr2/archive/S0836VYL/6/5/dicom: No such file or directory
[onrc@ado2dev /]$ 

我想念什么?

2 个答案:

答案 0 :(得分:0)

尝试使用此:

QString p("/usr2/archive/S1234ABC/5/6");
QDir d(p);

if(!d.exists() && !d.mkpath(p)) qDebug() << "Error: can't create folder '"<< p <<"'.";
else qDebug() << "Folder '"<< p <<"' exists or created successfully".

希望它对您有帮助。

答案 1 :(得分:0)

好吧,这是一本用于唱片的书...

问题是在插入数据库之前,在S1234ABC字符串的末尾附加了一个空终止符。该字符串后来用于创建上述路径。该S1234ABC字符串是使用以下代码创建的:

QString prefix = "S";
QChar C1, C2, C3, etc... (randomly generated characters)
QString newID = prefix + C1 + C2 + etc...

这将创建一个QString,其结尾带有\ 0。 Qt将此值存储在MySQL数据库中,然后我将其拉回Qt并尝试使用它建立路径。由于它是一个以空值终止的字符串,因此在phpMyAdmin,xterm和日志文件中显示为正常。除了...在Windows的PuTTY中,我看到了它试图创建的怪异路径:

/usr2/archive/S0836VYL\u0000/10/3/dicom

感谢腻子显示了实际的unicode值,而不是忽略了它。谢谢腻子!我从来没有想过...

使用QStrings(而不是QChar)为每个字符重新创建S1234ABC字符串,从而解决了此问题。现在,我在数据库中有常规的旧字符串和常规路径。