QDir verhällt sich anders unter linux

Verschiedenes zu Qt
Antworten
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

QDir verhällt sich anders unter linux

Beitrag 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!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ein typischer Fall für QCoreApplication::applicationDirPath() und QDir::currentPath().
Dein Script wird nicht da ausgeführt wo du denkst ;)
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag 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! 
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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)
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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...
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag von Seikilos »

Mach ich dann morgen früh bei der arbeit und meld mich dann
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Antworten