Datei im Verzeichnis des Executables öffnen
-
Zur Klarstellung:
* Ich kenne den Namen der Datei, aber nicht den Pfad dorthin.
* Der Pfad ist der selbe wie der meiner ausführbaren Datei
* Ich will nicht schreiben, ich will nur lesenUnter Linux geht wol dieses:
char szTmp[100]; sprintf(szTmp, "/proc/%d/exe", getpid()); int bytes = readlink(szTmp, s, n);Unter Windows jenes:
int bytes = GetModuleFileName(0, s, n);Aber etwas Plattformunabhängiges, zb mit boost::filesystem habe ich noch nicht gefunden
-
Wenn du Sie spezifisch öffnen möchtest, musst du es sagen, sonst natürlich C++ Filestreams! Die funktionieren überall, wo du eine Anwendung compilieren kannst. Sonst müsstest du schon konkreter werden. Ich hab zuerst gedacht, du willst iwie Bilder öffnen, speziell behandeln, oder Audio-Dateien, usw.
Wenn der Pfad der Datei derselbe wie der deiner executable ist, dann sollte ich dich auf relative Dateipfade verweisen, da du durch diese "Technik" nicht einmal irgendeinen Slash brauchst. Es wird einfach der Dateiname angegeben.
-
Falls es noch aktuell ist empfehle ich hier die Filesystem Library aus Boost.
http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/reference.html#current_path
Returns: The current working directory path, as if by POSIX getcwd(). is_absolute() is true for the returned path.
-
Ihr vergesst hier offenbar, dass das Arbeitsverzeichnis nicht dem Verzeichnis der ausführbaren Datei entsprechen muss (AFAIK z.B. wenn man eine Datei über eine Verknüpfung öffnet).
-
Ja, aber der Standard garantiert doch das:
argv[0] shall be the pointer to the initial character of a ntmbs that represents the
name used to invoke the program or "".Also sowas:
std::string verzeichnis(std::string(*argv).substr(0, s.first.rfind('\\'))); std::ifstream stream((verzeichnis + dateiname).c_str());
-
wxSkip schrieb:
Ihr vergesst hier offenbar, dass das Arbeitsverzeichnis nicht dem Verzeichnis der ausführbaren Datei entsprechen muss (AFAIK z.B. wenn man eine Datei über eine Verknüpfung öffnet).
Gibt es dafür nicht spezielle Definitionen, wie das läuft? Ich bin sicher, der erste Kommandozeilenparameter ist nachwievor das Verzeichnis der executable. Ich glaube gar, eine Verknüpfung ist nichts weiter als eine executable die eine andere aufruft, also ist es ja völlig irrelevant ob diese in- oder direkt aufgerufen wird.
-
Hacker schrieb:
Ja, aber der Standard garantiert doch das:
argv[0] shall be the pointer to the initial character of a ntmbs that represents the
name used to invoke the program or "".Also sowas:
std::string verzeichnis(std::string(argv).substr(0, s.first.rfind('\\'))); std::ifstream stream((verzeichnis + dateiname).c_str());Seit wann kann man std::string(argv) schreiben?
Du zitierst doch schon selbst, dass argv[0] auch "" sein kann...
-
Hacker schrieb:
wxSkip schrieb:
Ihr vergesst hier offenbar, dass das Arbeitsverzeichnis nicht dem Verzeichnis der ausführbaren Datei entsprechen muss (AFAIK z.B. wenn man eine Datei über eine Verknüpfung öffnet).
Gibt es dafür nicht spezielle Definitionen, wie das läuft? Ich bin sicher, der erste Kommandozeilenparameter ist nachwievor das Verzeichnis der executable. Ich glaube gar, eine Verknüpfung ist nichts weiter als eine executable die eine andere aufruft, also ist es ja völlig irrelevant ob diese in- oder direkt aufgerufen wird.
Verknüpfungen haben immer noch die Dateiendungen .lnk und sind sogar (umständlich) in Texteditoren einsehbar.
-
Ich dachte, argv ist ein char**?
Also ist
argv[x] <=> *(argv + x)
-
Hacker schrieb:
Ich dachte, argv ist ein char**?
Also ist
argv[x] <=> *(argv + x)Genau. Und wo findest du hier einen Konstruktor für char **?
-
wxSkip schrieb:
Hacker schrieb:
Ich dachte, argv ist ein char**?
Also ist
argv[x] <=> *(argv + x)Genau. Und wo findest du hier einen Konstruktor für char **?
Jaja, du hast ja recht. Editiert!
-
Wat is s?
-
Der Standard garantiert nichtmal dass es sowas wie Verzeichnisse überhaupt gibt.
Einen wirklich plattformunabhängigen Weg kanns daher also rein prinzipiell schon nicht geben.
Hier vielleicht ein hilfreiches Posting: http://stackoverflow.com/a/1024937
-
Wenn es auf dem System keine Verzeichnisse gibt, hat das Programm auch keinen Sinn mehr.
-
Naja, dann nimm eben am einfachsten argv[0] oder implementier dir eben eine Funktion für jedes System das du unterstützen willst. So kompliziert ist das dann doch auch wieder nicht...
-
dot schrieb:
Naja, dann nimm eben am einfachsten argv[0] oder implementier dir eben eine Funktion für jedes System das du unterstützen willst. So kompliziert ist das dann doch auch wieder nicht...
Womit man wieder auf meinen Weg geht, oder gleich sowas:
std::string GetProgrammDirectory() { #ifdef _Windows // WINAPI-Code #elif __unix__ || __unix //POSIX-konformer Code #elif __OS2__ // Für OS2 (was für eine Überraschung) #else // Code mit Standard-C++ Filestreams als Alternative #endif }Edit: Nur ein Beispiel! Mir ist klar, dass das da oben sinnlos ist.
-
Könnt ihr bitte mal aufhören, trivialen Mist mit argv[0] vorzuschlagen? Der OP hat bereits im ersten Post gezeigt, dass er mit boost und argv[0] nicht so recht weiterkam. Einige bekleckern sich hier nicht gerade mit Ruhm.
Hobo schrieb:
Wenn es auf dem System keine Verzeichnisse gibt, hat das Programm auch keinen Sinn mehr.
Die Argumentation war, dass der Standard keine Verzeichnisse kennt und daher nicht helfen kann. Inwiefern hilft dir dann die Feststellung, dass das Programm auf Systemen ohne Verzeichnisse keinen Sinn macht?
-
Michael E. schrieb:
Könnt ihr bitte mal aufhören, trivialen Mist mit argv[0] vorzuschlagen?
Das denke ich auch, ifdefs sind die einzige Möglichkeit und bei jedem mir bekannten OS als jeweils ~Dreizeiler zu implementieren.
-
Thorgrim schrieb:
Michael E. schrieb:
Könnt ihr bitte mal aufhören, trivialen Mist mit argv[0] vorzuschlagen?
Das denke ich auch, ifdefs sind die einzige Möglichkeit und bei jedem mir bekannten OS als jeweils ~Dreizeiler zu implementieren.
Dankeschön!

-
Michael E. schrieb:
Könnt ihr bitte mal aufhören, trivialen Mist mit argv[0] vorzuschlagen? Der OP hat bereits im ersten Post gezeigt, dass er mit boost und argv[0] nicht so recht weiterkam. Einige bekleckern sich hier nicht gerade mit Ruhm.
Vielleicht macht der OP das ja nicht richtig, was ein guter Grund wäre, diese trivialen Ansätze nicht gleich zu verwerfen, sondern ihm einige Hilfestellungen hinsichtlich dieser zu geben.
Hobo schrieb:
Wenn es auf dem System keine Verzeichnisse gibt, hat das Programm auch keinen Sinn mehr.
Die Argumentation war, dass der Standard keine Verzeichnisse kennt und daher nicht helfen kann. Inwiefern hilft dir dann die Feststellung, dass das Programm auf Systemen ohne Verzeichnisse keinen Sinn macht?
Die Feststelung hilft mir, und ich hoffe auch anderen :), insofern, dass der Sinn des Programms ist,
eine Datei (deren Name ich kenne) im Verzeichnis der ausfühbaren Datei zu öffnen.
Auf einem System, das keine Verzeichnisse kennt, hat das Programm also keinen Sinn.
Insofern müssen Verzeichnisse garantiert sein, wenn nicht durch den Standard, dann durch das System.