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.