QDir mkpath возвращает true, но каталог не создан - PullRequest
0 голосов
/ 04 июня 2019

У меня странная проблема с созданием путей с использованием Qt в Linux. Я написал отдельную тестовую программу, которая создает пути и тесты для их существования. Это работает как ожидалось и создает каталог.

/* 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 голосов
/ 05 июня 2019

Хорошо, это одна из книг рекордов ...

Проблема заключалась в том, что в конец строки 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 и в файлах журнала. За исключением ... в puTTY в Windows, где я увидел странный путь, который он пытался создать:

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

К счастью, puTTY отображает фактическое значение Юникода, а не игнорирует его Спасибо, замазка! Я никогда, никогда бы не понял это ...

Повторное создание строки S1234ABC с использованием QStrings для каждого символа вместо QChar устранило проблему. Теперь у меня есть обычные старые строки в базе данных и нормальные пути.

0 голосов
/ 04 июня 2019

Попробуйте использовать это:

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".

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...