CFileDialog --- die Krux mit den Pfaden
-
Aloha,
ich habe sehr viele Dateiangaben in meinem Programm mit relativen Pfaden angegeben.
Nach Benutzung eines CFileDialogs funktionieren diese nich mehr.
Warum zur Hölle wird der Pfad in dem die exe liegt plötzlich durch den beschis... CFileDialog verändert ???Vor allen Dingen, wie bekomme ich das wieder hin, daß der ich nenne es mal "Ausgangspfad", richtig wäre wahrscheinlich CommandLine, wieder der alte ist, und die relativen Pfade wieder funzen.
Grüße und Danke
BOA
-
CFileDialog ändert nicht "Das Verzeichnis, wo die EXE liegt", aber offenbar das aktuelle Arbeitsverzeichnis. Dies kann auch beim Programmstart ein anderes als das EXE-Verzeichnis sein!
Empfehlung: CPath
GetModuleFileName().GetPath()
für den Pfad der EXE, und
CPath::MakeAbsolute(basePath)
verwandelt relative in absolute Pfade.
-
Aloha peterchen,
vielen Dank für die Empfehlung.
Die Online Darstellung Deines Projektes gefällt mir gut, sehr übersichtlich und strukturiert, mal so nebenbei bemerkt ( bist Du Aborigine ???)
Die Frage ist tatsächlich aber, ob ich noch ne Klasse hinzupacken muß.
Das Arbeitsverzeichnis kann sich doch net einfach ändern durch CFileDialog, bzw. wenn doch, dann muß es ne Möglichkeit geben, das wieder rückgängig zu machen, ohne großen Aufwand zu betreiben...
Ich danke Dir trotzdem erstmal...
Grüße
BOA
-
Klar. Arbeitsverzeichnis = Aktuelles Verzeichnis != EXE-Verzeichnis
Man könnte dein Programm also ganz einfach austricksen, wenn man eine Verknüpfung anlegt und das Arbeitsverzeichnis auf C:\foo legt, statt auf den Pfad deiner exe...
Alternativ zu peterchens Klasse kannst du mal in die MFC-FAQ gucken, da steht auch ein Weg wie man den EXE-Pfad bekommt.
-
Ist traurig das die MFC nichts direkt dafür dabei hat. Sowas brauch man doch fast in jedem Programm.
-
Du kannst auch das aktuelle Verzeichnis auslesen und nacher wiederherstellen (GetCurrentDirectory, SetCurrentDirectory), aber das aktuelle Verzeichnis ist keine allzu robuste Sache - nach dem dritten "Die Hilfe geht nicht mehr" - Anruf würde micht nicht mehr drauf einlassen.
CPath verwendet hauptsächlich die "Shell Lightweight Utility API", ist also nicht sehr groß. Kommt halt ganz auf deine Anwendung an.
bist Du Aborigine???
nö, Wandersachse
-
@TAW: MFC 7 hat eine ähliche Path-Klasse, die ist aber nur ein kleiner wrapper, und bei weitem nicht so bequem :werbetrommer rühr:
-
ihr könnt auch sowas ähnliches machen
std::string GetMyPath() { char f[MAX_PATH]; GetModuleFileName (0, f, MAX_PATH); std::string s = f; return s.erase (s.rfind("\\")+1, s.length()); }
und dann einfach nur den dateinamen anhängen. alles relativ zur .exe hat echt vorteile. man kann z.b. das ganze verzeichnis verschieben und es funzt immer noch
-
Wir sind hier im MFC-Forum. Daher verwende doch bitte CString.
Der Quellcode ist übrigens genau der, der auch ind er FAQ zu finden ist.
-
dEUs schrieb:
Klar. Arbeitsverzeichnis = Aktuelles Verzeichnis != EXE-Verzeichnis
Man könnte dein Programm also ganz einfach austricksen, wenn man eine Verknüpfung anlegt und das Arbeitsverzeichnis auf C:\foo legt, statt auf den Pfad deiner exe...
Alternativ zu peterchens Klasse kannst du mal in die MFC-FAQ gucken, da steht auch ein Weg wie man den EXE-Pfad bekommt.Naja,
GetCommandLine() sollte da helfen, aber wie gesagt ich bin zu faul jetzt an allen Stellen den relativen Pfad umzuwandeln und sei es durch davorsetzen eines Strings, der mir von GetCommandline() geliefert wird.
peterchen schrieb:
Du kannst auch das aktuelle Verzeichnis auslesen und nacher wiederherstellen (GetCurrentDirectory, SetCurrentDirectory), aber das aktuelle Verzeichnis ist keine allzu robuste Sache - nach dem dritten "Die Hilfe geht nicht mehr" - Anruf würde micht nicht mehr drauf einlassen.
Warum ist das nicht robust, hast Du Erfahrungen damit gemacht ?
Ich habs gerade getestet, und es funzt augenscheinlich erstmal prima, und wäre damit genau das, was ich gesucht hab...Grüße und Danke Euch...
BOA
-
Arrgggh,
wenn ich den FileDialog offen habe, ist der Pfad falsch.....
Schließe ich ihn, ist er wieder korrekt, aber das kann für den ein oder anderen Thread zu spät sein, der den richtigen Pfad benötigt.....F..k, ich komm net drumherum...
Grüße
BOA
-
dEUs schrieb:
Wir sind hier im MFC-Forum. Daher verwende doch bitte CString.
Der Quellcode ist übrigens genau der, der auch ind er FAQ zu finden ist.sorry. das sollte sich ja ganz einfach auf 'CString' ummodeln lassen (von hinten alles bis zum ersten \ abschneiden). bei mfc muss man aber, glaub' ich, dann '_splitpath' dafür bemühen
-
Hm, man kann es auch mit der MFC von Hand machen, so wie du es gemacht hast.
-
dEUs schrieb:
Hm, man kann es auch mit der MFC von Hand machen, so wie du es gemacht hast.
möglich. aber ich denke man kann auch mfc und stl-zeug mischen.
-
Warum ist das nicht robust, hast Du Erfahrungen damit gemacht?
F..k
ja
Es gibt so viele Aktionen, die dein aktuelles Verzeichnis verändern können, ich hab's mir also abgewöhnt, mich überhaupt drauf zu verlassen.
Trotzdem löst das nicht alle Probleme. "Unser" derzeitiges Release hat ein Problem mit der Online-Hilfe: HTMLHelp sucht verknüpfte CHM's im aktuellen Verzeichnis...
-
Aloha peterchen,
ich konnte einfach nicht aufhören zu suchen und habe etwas gefunden, was für Dein CPath - Projekt interessant sein könnte.
_getcwd
gibt das aktuelle Arbeitsverzeichnis !!!
Das setze ich global am Anfang und verändere nur die Pfade in den Threads und fertig.Beste Grüße und Danke noch einmal
BOA