C++: Wie Pfad ermitteln, aus dem Konsolenprogramm gestartet wurde?



  • Hallo.

    Ich bräuchte einen C++ Code womit ich auslesen kann in welchem Ordner das Konsolenprigramm liegt.

    Greetz Crysis



  • Mit Standard-C++: Gar nicht. Das kennt nicht mal Konsolen oder Pfade.

    Unter Windows: GetModuleFileName Wenn du nur den Pfad brauchst, dann musst du halt noch den Dateiname am Ende abschneiden.



  • Von einem freund habe der mit autoit programmiert habe ich erfahrrn das man das überdie Taskid auslesen kann. Geht soetwas aus bei c++? Falls ich es auf andere BS portieren will.



  • Das Erste Element des Arrays argv , welches du der main()-Funktion übergeben kannst ist der Pfad+Name des Programmes, musst halt nur noch den Namen abschneiden.

    int main(int argc, char** argv);
    

    Von einem freund habe der mit autoit programmiert habe ich erfahrrn das man das überdie Taskid auslesen kann

    Weder Tasks noch Threads noch Prozesse haben etwas mit Standard C++ am Hut, da musst du die API des jeweiligen Betriebssystems nutzen (oder eine andere API).


  • Mod

    Der Tobi schrieb:

    Das Erste Element des Arrays argv , welches du der main()-Funktion übergeben kannst ist der Pfad+Name des Programmes,

    Nur unter bestimmten Bedingungen die sehr oft aber nicht gegeben sind. Beispielsweise wenn das Programm in einem Standardsuchpfad einer Shell liegt und von dieser aus direkt mit seinem Namen ohne Pfadangabe aufgerufen wurde, dann steht da auch nur dieser Name.

    Eine wichtige Frage an den Threadersteller wäre: Warum meinst du, diesen Pfad zu benötigen?



  • Das heisst das argv[0] der pfad ist oder was?



  • Ich möchte eine datei speichern.

    Der user soll den pfad eingeben. Wenn er 1 eingibt soll die datei beim prigramm gespeichert werden.



  • Crysis_02 schrieb:

    Wenn er 1 eingibt soll die datei beim prigramm gespeichert werden.

    So was macht man nicht. Ist auch für normale Benutzer unter aktuellen Betriebssystemen gar nicht erlaubt.



  • MFK schrieb:

    Crysis_02 schrieb:

    Wenn er 1 eingibt soll die datei beim prigramm gespeichert werden.

    So was macht man nicht. Ist auch für normale Benutzer unter aktuellen Betriebssystemen gar nicht erlaubt.

    Wie macht man denn sonst sowas?



  • Crysis_02 schrieb:

    Wie macht man denn sonst sowas?

    Das kommt auf das Betriebssystem an. Es gibt üblicherweise klar definierte Speicherorte für Benutzerdokumente und Einstellungen.



  • Nein. Sowas brauche ich nicht. Wenn das prog im oderner x gespeichert ist dann soll die dateiwenn man 1 eongibt es in x gespeichert ist. Wenn man aber C:/y eingibt dann soll es halt im ordner y gespeichert werden.


  • Mod

    Crysis_02 schrieb:

    Wenn das prog im oderner x gespeichert ist dann soll die dateiwenn man 1 eongibt es in x gespeichert ist.

    MFK schrieb:

    So was macht man nicht. Ist auch für normale Benutzer unter aktuellen Betriebssystemen gar nicht erlaubt.



  • Beispielsweise wenn das Programm in einem Standardsuchpfad einer Shell liegt und von dieser aus direkt mit seinem Namen ohne Pfadangabe aufgerufen wurde, dann steht da auch nur dieser Name.

    Oha, stimmt, grad ausprobiert. Dann kannst du meine Antwort streichen, wusste ich auch nicht, danke.


  • Mod

    Der Tobi schrieb:

    Oha, stimmt, grad ausprobiert. Dann kannst du meine Antwort streichen, wusste ich auch nicht, danke.

    Um das übrigens mal kurz zu machen: Diese Frage kommt hier dauernd. Warum sie an sich nicht sinnvoll ist, wurde schon erklärt. Falls man aus irgendeinem Grunde doch diesen Pfad braucht (und das sollte man nicht!), dann kann man Standardmittel sowieso vergessen. Es gibt betriebssystemabhängige Methoden, mit denen dies so halbwegs möglich ist, aber soweit ich mich erinnere auch nicht bei jedem denkbarem Szenario. Wie es genau geht, erfährt man, indem man das Forum durchsucht oder (aber nur wenn die Suche wirklich nichts gebracht hat) im entsprechenden Betriebssystemforum nachfragt. Wo einem dann übrigens wieder als allererstes gesagt werden wird, dass man diesen Pfad nicht benötigen sollte.



  • So ich habe dies zwar noch nicht integriert.
    Da der Benutzer auch selber einen Pfad angeben soll es mit nem Slash oder Backslash macht wollte ich die string.find und string.replace funktion benutzen.

    Wenn ich diese aber nun so integriere:

    size_t found5;
    			if (folder.find("\\"))
    			{
    				found5=folder.find("\\");
    				folder.replace(found5,1,"\\\\");
    			}
    			size_t found4;
    			if (folder.find("\/"))
    			{
    				found4=folder.find("\/");
    				folder.replace(found4,1,"\\\\");
    			}
    

    stürzt es immer ab.

    Kann mir jemand sagen, was falsch ist?


  • Mod

    http://www.cplusplus.com/reference/string/string/find/

    Return Value
    The position of the first occurrence in the string of the searched content.
    If the content is not found, the member value npos is returned.

    Hervorhebung durch mich.

    P.S.: Einen Slash brauchst du nicht escapen. Außerdem sollte es sowieso Wurst sein, ob da nun Slashes oder Backslashes in dem Pfad stehen. Pfade sind Betriebssystemsache. Wenn das Betriebssystem Backslash versteht, dann kannst du auch welche benutzen.



  • file.open kann damit aber nicht umgehen. Um einen Pfed zu haben brauche ich C:\\Programme\...

    unterdessen eht es aber wieder.


  • Mod

    Crysis_02 schrieb:

    file.open kann damit aber nicht umgehen.

    Zeig mal Details. Ich rate mal, dass du Windows benutzt (weil kein anderes verbreitetes System Backslash für Pfade benutzt). Windows kann seit ein paar 15 Jahren mit Slashes statt Backslashes umgehen.



  • undesssen geht das alles 😉

    jedoch bräuchte ich noch den pfad de sprogrammes auslesen mit

    int main(int argc, char* argv[]);
    

    wenn ich

    cout<<argv [0];
    

    eingeben dann kommt auch der Pfad mit der .exe zum schluss.

    Ich kann ich die char* in einen String umwanden, um sie zu kürzen und um diese weiterzubenutzen?


  • Mod

    Crysis_02 schrieb:

    Ich kann ich die char* in einen String umwanden, um sie zu kürzen und um diese weiterzubenutzen?

    Klar, einfach zuweisen. Aber hast du den Thread überhaupt gelesen? Erstens ist das eine schlechte Idee und zweitens geht das so ohnehin nicht, wie alles schon diskutiert wurde.


Log in to reply