Datei im Verzeichnis des Executables öffnen



  • 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.



  • Hacker schrieb:

    Dankeschön! 🙂

    Naja, die Makros sind noch nicht ganz richtig...



  • Hobo schrieb:

    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.

    Lass mal sehen.
    "Hi" meint, einfach nur den Dateinamen anzugeben -> Quatsch.
    Thuruk zeigt, wie man eine Datei öffnet, von der man den Pfad kennt.
    Hacker sagt, dass es sowas Tolles wie die Standardfilestreams gibt und dass man als relativen Pfad lediglich den Dateinamen anzugeben braucht -> Quatsch.
    Du kommst mit dem aktuellen Working Directory -> Quatsch.
    Hacker kommt mit einem Standard-Zitat zu argv[0] und leitet daraus (oder besser gesagt völlig zusammenhangslos) unbrauchbaren Code her.
    Daraufhin ist sich Hacker noch sicher, dass in argv[0] doch eigentlich der Pfad des Programms steht und dass Verknüpfungen eigentlich nur Programme sind, die andere Programme aufrufen (Hinweis an Hacker: Ausprobieren schadet nicht).

    Tolle Hilfe.

    Insofern müssen Verzeichnisse garantiert sein, wenn nicht durch den Standard, dann durch das System.

    Ich wiederhole meine Frage: Was bringt dir das?



  • Michael E. schrieb:

    Ich wiederhole meine Frage: Was bringt dir das?

    Was bringen uns Gabeln? Bescheuerte Frage.



  • Hacker schrieb:

    Was bringen uns Gabeln? Bescheuerte Frage.

    Gabeln wurden in diesem Thread aber auch noch nicht erwähnt, vor allem nicht nach der Feststellung, dass Gabeln nicht überall auf der Welt verwendet werden.



  • Mal vom Essbesteck der jeweiligen Kultur abgesehen: Warum genau musst du denn auf eine Datei im Verzeichnis des Executeable zugreifen? Warum reicht ein Pfad relativ zum Working Directory nicht aus? Um was genau für eine Datei handelt es sich da denn?


Anmelden zum Antworten