291 Stimmen

Wie erhalte ich das Verzeichnis, in dem ein Programm ausgeführt wird?

Gibt es eine plattform- und dateisystemunabhängige Methode, um den vollständigen Pfad des Verzeichnisses zu ermitteln, in dem ein Programm mit C/C++ ausgeführt wird? Nicht zu verwechseln mit dem aktuellen Arbeitsverzeichnis. (Bitte schlagen Sie keine Bibliotheken vor, es sei denn, es sind Standardbibliotheken wie clib oder STL).

(Wenn es keine plattform- bzw. dateisystemunabhängige Methode gibt, sind Vorschläge, die unter Windows und Linux für bestimmte Dateisysteme funktionieren, ebenfalls willkommen).

4 Stimmen

Es sei denn, Sie können den Pfad zuverlässig aus argv[0] ist die Technik sehr betriebssystemabhängig.

2 Stimmen

Nur zur Klarstellung: Das "aktuelle Verzeichnis" oder "das Verzeichnis, in dem das Programm läuft" (in der Terminologie der Frage) ist das Verzeichnis, in dem sich die Image-Datei des Programms (~.exe-Datei) befindet, und das "aktuelle arbeiten directory' das Verzeichnis ist, das automatisch vervollständigt wird, wenn das Programm relative Pfade verwendet?

4 Stimmen

Wenn Sie #include <windows.h> setzt Windows automatisch eine char* zum ausführbaren Pfad in _pgmptr . Wenn Sie nur unter Windows arbeiten, brauchen Sie keine zusätzlichen Funktionen aufzurufen und keinen Müll anzunehmen.

20voto

Marqin Punkte 1078

Dateisystem TS ist jetzt ein Standard ( und unterstützt von gcc 5.3+ und clang 3.9+ ), also können Sie current_path() Funktion von ihm:

std::string path = std::experimental::filesystem::current_path();

In gcc (5.3+) müssen Sie zum Einbinden von Filesystem verwenden:

#include <experimental/filesystem>

und verknüpfen Sie Ihren Code mit -lstdc++fs Flagge.

Wenn Sie Filesystem mit Microsoft Visual Studio verwenden möchten, dann dies lesen .

10voto

Michael Burr Punkte 320591

Nein, es gibt keine Standardmethode. Ich glaube, dass die C/C++-Standards nicht einmal die Existenz von Verzeichnissen (oder anderen Dateisystemorganisationen) berücksichtigen.

Unter Windows wird die HoleModulDateiname() gibt den vollständigen Pfad zu der ausführbaren Datei des aktuellen Prozesses zurück, wenn die hModul auf den Parameter NULL . Bei Linux kann ich nicht helfen.

Außerdem sollten Sie klären, ob Sie das aktuelle Verzeichnis oder das Verzeichnis, in dem sich das Programmabbild/die ausführbare Datei befindet, benötigen. So wie es aussieht, ist Ihre Frage in diesem Punkt ein wenig zweideutig.

10voto

Adam Yaxley Punkte 670

Unter Windows ist der einfachste Weg die Verwendung des Befehls _get_pgmptr Funktion in stdlib.h um einen Zeiger auf eine Zeichenkette zu erhalten, die den absoluten Pfad zur ausführbaren Datei darstellt, einschließlich des Namens der ausführbaren Datei.

char* path;
_get_pgmptr(&path);
printf(path); // Example output: C:/Projects/Hello/World.exe

8voto

Paige Ruten Punkte 164391

Vielleicht das aktuelle Arbeitsverzeichnis mit argv[0] verknüpfen? Ich bin mir nicht sicher, ob das unter Windows funktionieren würde, aber unter Linux funktioniert es.

Zum Beispiel:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

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

    getcwd(the_path, 255);
    strcat(the_path, "/");
    strcat(the_path, argv[0]);

    printf("%s\n", the_path);

    return 0;
}

Wenn es ausgeführt wird, wird es ausgegeben:

jeremy@jeremy-desktop:~/Desktop$ ./test
/home/jeremy/Desktop/./test

7voto

Torbjörn Gyllebring Punkte 17358

Für Win32 GetCurrentDirectory sollte das genügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X