我在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 /]$
我想念什么?
答案 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字符串,从而解决了此问题。现在,我在数据库中有常规的旧字符串和常规路径。