Seite 1 von 1

kurze Frage zu Standartpfaden

Verfasst: 15. März 2009 20:53
von CodeMonkey
Wie kann ich mit QFile eine Datei erstellen, die jedoch in einen Unterordner im Hauptverzeichnis des Programms liegen soll? Also, dass dort, wo meine .exe Datei sich befindet ein neuer Ordner (z.B. namens "Save") erstellt wird, in dem ich dann meine Daten als Datei abspeichere...

ich habs bisher mit

Code: Alles auswählen

QFile File("Save\Datei.dat");
versucht, aber ohne Erfolg. Bitte vergebt mir wenn das irgendwo in der Dokumentation steht, aber ich hab nix gefunden bei QFile

Verfasst: 15. März 2009 21:15
von androphinx
bist du dir sicher, dass du es immer so versucht hast? so kann es nicht funktionieren weil ein alleinstehendes \ in einem string ein steuerzeichen erzeugt.... c++ grundlagen ;)

Mfg androphinx

Verfasst: 15. März 2009 21:16
von CLRS530
Meinst du im ernst QFile würde automatisch Ordner/einen Pfad erstellen? Das wäre ja noch schöner. Was für ein Chaos würde das anrichten :D
Ist doch aber ganz einfach. QDir::mkPath und QDir::mkFolder sind deine Freunde.
Vorsicht beide sind nicht static.

Verfasst: 15. März 2009 21:17
von CodeMonkey
Ist mir bereits auch aufgefallen, dass das was mit escape Sequenzen zu tun hat, trotzdem wüsste ich gern wie man das löst...

Edit: Danke CLRS530, ich werd mich mal in die Richtung informieren

Verfasst: 15. März 2009 21:26
von CLRS530

Code: Alles auswählen

QDir(QCoreApplication::applicationFilePath()).mkdir("Save");
QFile(QCoreApplication::applicationFilePath() + QDir::separator() + "Save" + QDir::separator() + "Datei.dat");
Was gibt es da in die Richtung zu gehen, das ist doch wirklich nicht schwer ;)
Das mit QCoreApplication::applicationFilePath() könntest du dir theoretisch sparen, aber ich halte es für sicherer und ebsser, da der default path sich immer ändern kann.
Desweiteren übernehme ich keine Garantie für diesen Code, da ich ihn hier im Forum geschrieben habe 8).

EDIT: sollte mkdir nur mit einem relativen ordner gehen, nimmste folglich dann natürlich mkpath.

Verfasst: 15. März 2009 21:45
von CodeMonkey
naja was ich will ist ja quasi ein relativer pfad, also sollte das schon tun. Ich versteh jetzt noch nich so ganz was es mit dem QCoreApplication auf sich hat, aber ich denk das kann ich nachlesen

vielen Dank für den Code-schnipsel, der hat vieles verdeutlicht. Wenn man sich in einem Thema auskennt ist es aber immer "nicht schwer"^^, das seh ich selbst bei mir: solange an einem Problem knabbern, bis die Lösung da is und sich am ende wundern, warum man bei sowas leichtem so viel Zeit verliern konnte. Scheint in der Natur des Lernens zu liegen...

Verfasst: 15. März 2009 21:50
von CLRS530
Warte dann verdeutliche ich dir das.
Normalerweise solltest du es so machen können:

Code: Alles auswählen

QDir().mkdir("Save"); 
QFile("Save" + QDir::separator() + "Datei.dat"); 
Weil dann eigentlich Qt den Pfad deine Applikation nimmt. Aber der Default Pfad kann zumindestens unter normalen C programmen geändert werden und damit würdest du sonstwo landen können.
Ich nehme an, dass Qt dafür immer einen gespeicherten Programmpfad nimmt, aber sicher ist sicher :)

QDir::separator() ist nichts anderes als '\\' unter Windows und sonst '/'.
QCoreApplication::applicationFilePath() gibt den Programmpfad zurück.
Sagt dir alles die Doku.

Verfasst: 15. März 2009 22:16
von Christian81
QDir::separator() ist nicht nötig - '/' reicht für Qt-Klassen immer aus.

Verfasst: 16. März 2009 18:02
von CodeMonkey
ok jetzt hab ich alles verstanden und das Problem ist gelöst. Vielen Dank nochmal

Verfasst: 16. März 2009 18:13
von RHBaum
wobei DU aufpassen solltest !!!

QDir() liefert dir das Aktuelle Verzeichniss (current Dir) zurueck.
.
If path is empty the program's working directory, (".")

Das ist nicht immer das verzeichniss wo dein binary(.exe) drinsteht.

Wenn du das Programm z.b. mit deinem absoluten pfad also sowas wie c:\Program Files\MyProg\Myprog.exe aufrufst, oder ne verknuepfung so anlegst, kann dein current DIR sonstwo sein. Bei windows, (und glaub Linux) kannst das StartVerzeichniss(current Dir) sogar noch seperat in der verknuepfung einstellen ....

Um sowas abzufangen muesstest du die Kommandozeilen Parameter parsen ... weil die geben den vollen aufgerufen im argv[0] an, und dort siehst dann wie aufgerufen wurdest.

Zum glueck macht das ganze die QT mit Qapplication fuer dich ... wie CLRS530 es dir scho gezeigt hat ...

Ciao ..