Seite 1 von 1

QDir verhällt sich anders unter linux

Verfasst: 15. Februar 2010 14:54
von Seikilos
Ich habe folgenden Code, der unter Windows etwas anderes tut, als unter Linux.
(Was ziemlich nervt)

Code: Alles auswählen

QDir dir ("existiert_nicht");
bool newExist = dir.cdUp();
assert(newExist==true);
Funktioniert unter windows wunderbar.
Unter linux kommt da ein false. WTF?

Wenn ich unter Linux folgendes mache:

Code: Alles auswählen

QDir absolute ("/home/pfad_bishierhin_ok/existiert_nicht");
QDir relative ("./existiert_nicht");
assert(absolute.absolutePath() == relative.absolutePath()); // true! 
bool newExist = dir.cdUp();
assert(newExist==true);  // false!
Dann funktioniert es, obwohl die Situation gleich ist, der Vergleich beider Pfade ergibt true, das cdUp false.

Der selbe Müll:

Code: Alles auswählen

QDir absolute ("/home/pfad_bishierhin_ok/existiert_nicht");
QDir relative ("./existiert_nicht");

relative.makeAbsolute();

assert(absolute.absolutePath() == relative.absolutePath()); // true! 
bool newExist = dir.cdUp();
assert(newExist==true);  // false!

Verfasst: 16. Februar 2010 17:23
von franzf
Ein typischer Fall für QCoreApplication::applicationDirPath() und QDir::currentPath().
Dein Script wird nicht da ausgeführt wo du denkst ;)

Verfasst: 16. Februar 2010 17:52
von Seikilos
franzf hat geschrieben:Ein typischer Fall für QCoreApplication::applicationDirPath() und QDir::currentPath().
Dein Script wird nicht da ausgeführt wo du denkst ;)
Wenn das der Fall ist, wieso funktioniert der Code, den ich als letztes gepostet habe? Wieso ist das assert true?

Code: Alles auswählen

QDir absolute ("/home/pfad_bishierhin_ok/existiert_nicht");
QDir relative ("./existiert_nicht");

relative.makeAbsolute();

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
assert(absolute.absolutePath() == relative.absolutePath()); // true!

bool newExist = dir.cdUp();
assert(newExist==true);  // false! 

Verfasst: 16. Februar 2010 18:17
von franzf
Ich denke trotzdem, dass es daran liegt wie du dein Programm ausführst. Ich hab jetzt in der Python-Konsole (qt-4.6.1, PyQt4-4.7) gespielt - und da liefert ein "QDir("tmp").cdUp()" brav ein True.
Wenn du auf deine exe clickst wird unter Linux dein HomeDir (oder DocumentDir) als CurrentDir gesetzt. Ein "existiert_nicht" im ApplicationDir bekommst du dann nicht mit einem "QDir("existiert_nicht")".
Hingegen wenn du es aus der Konsole startest, sollte (wohlgemerkt ^^) currentDir == applicationDir sein...

Ansonsten wenn ein "./existiert_nicht" unter Linux funktioniert, setz doch das in den Code, das sollte auch unter WIndows gehen. (Hab leider keines zum Testen)

Verfasst: 16. Februar 2010 18:19
von Seikilos
franzf hat geschrieben: Ansonsten wenn ein "./existiert_nicht" unter Linux funktioniert, setz doch das in den Code, das sollte auch unter WIndows gehen. (Hab leider keines zum Testen)
Ich glaube wir reden aneinander vorbei.

Code: Alles auswählen

QDir dir ("./existiert_nicht");
bool newExist = dir.cdUp();
assert(newExist==true); // unter linux false 
Funktioniert unter linux bei mir auch nicht

Verfasst: 16. Februar 2010 18:32
von franzf
Nägel mit Köpfen:

Code: Alles auswählen

#include <QLabel>
#include <QApplication>
#include <QDir>

int main( int argc, char** argv )
{
    QApplication app (argc, argv );
    QLabel label;
    QString appDirPath = "<b>ApplicationDirPath: </b>" +
                         QCoreApplication::applicationDirPath();
    QString curDirPath = "<b>CurrentDirPath: </b>" +
                         QDir::currentPath();
    label.setText(appDirPath + "<br>" + curDirPath);
    label.show();
    return QApplication::exec();
}
Kompilieren und Ausführen.
Und sagen was rauskommt...

Verfasst: 16. Februar 2010 18:33
von Seikilos
Mach ich dann morgen früh bei der arbeit und meld mich dann

Verfasst: 17. Februar 2010 10:29
von Seikilos
Unter Windows:

Code: Alles auswählen

ApplicationDirPath: d:/Foo/VS2005/C++/bin/debug

CurrentDirPath: D:/Foo/C++/UnitTests
Linux

Code: Alles auswählen

ApplicationDirPath: /home/ich/bin/release
CurrentDirPath: /home/ich/bin/release
Diese Pfadspielchen sagen mir nichts.

Wenn die unterschiedlich sind usw.

Warum funktioniert dann folgender code nicht

Code: Alles auswählen

QDir dir ("./existiert_nicht");
dir.makeAbsolute();
bool newExist = dir.cdUp();
assert(newExist==true); // unter linux false 
Dieser Code aber schon:

Code: Alles auswählen

QDir dir1 ("./existiert_nicht");
QDir dir2(dir1.absolutePath());
bool newExist = dir2.cdUp();
assert(newExist==true); // unter linux nun true
Man merke auf, wenn makeAbsolute und absolutePath gleich saind, wieso funktioniert dann der zweite code, nicht aber der erste?


makeAbsolute müsste doch so funktionieren, wie es hier steht: http://doc.trolltech.com/4.5/qdir.html#makeAbsolute

Verfasst: 17. Februar 2010 11:10
von franzf
Du könntest anstelle des einsamen assert auch einfach die ganzen einzelnen Schritte per qDebug() oder Eintrag in nem QTextEdit (wenn du ne GUI hast und diese auch durch Click im Dateibrowser starten willst) debuggen.
Ich kann den Fehler nicht reproduzieren. Wenn ein makeAbsolute nicht geht aber ein absolutePath klingt das nach Bug.
Schau dich in der Bug-DB bei Nokia um, vllt. findest du da was.
Ansonsten wäre ein update auf Qt.4.6.x nicht schlecht - vllt. liegt es ja daran.

// edit: Was die Pfadausgaben bringen sollten siehst du doch. Starte es
1) aus der Konsole - beide dirs sind gleich.
2) über click im Dateimanager - beide sind unterschiedlich!
Denn ein QDir("./verzeichnis") startet aus dem QDir::current(). Wenn das ein anderes ist als das applicationDir(), du aber erwartest dass du dich im applicationDir() befindest, hast du das Problem gefunden.