24 Stimmen

Welche plattformübergreifende Möglichkeit gibt es, das aktuelle Verzeichnis zu ermitteln?

Ich brauche eine plattformübergreifende Möglichkeit, das aktuelle Arbeitsverzeichnis zu erhalten (ja, getcwd tut, was ich will). Ich dachte, dies könnte den Trick tun:

#ifdef _WIN32
    #include <direct.h>
    #define getcwd _getcwd // stupid MSFT "deprecation" warning
#elif
    #include <unistd.h>
#endif
#include <string>
#include <iostream>
using namespace std;

int main()
{
    string s_cwd(getcwd(NULL,0));
    cout << "CWD is: " << s_cwd << endl;
}

Ich habe dies gelesen:

Es sollte keine Speicherlecks geben, und es sollte auch auf einem Mac funktionieren, richtig?

UPDATE: Ich fürchte, etwas ist immer noch falsch hier (ich versuche zu vermeiden, ein Char-Array mit einer bestimmten Länge zu erstellen, da es keinen richtigen Weg, um eine anständige Länge für getcwd zu erhalten):

char* a_cwd = getcwd(NULL,0);
string s_cwd(a_cwd);
free(a_cwd); // or delete a_cwd?

28voto

catchmeifyoutry Punkte 6941

Wenn es für Sie kein Problem ist, verwenden Sie Boost-Dateisystem für bequeme plattformübergreifende Dateisystemoperationen.

boost::filesystem::path full_path( boost::filesystem::current_path() );

Hier ist ein Beispiel .

EDIT: wie von Roi Danton in den Kommentaren bemerkt, wurde das Dateisystem Teil des ISO C++ in C++17 so dass eine Verstärkung nicht mehr erforderlich ist:

std::filesystem::current_path();

14voto

R Samuel Klatchko Punkte 72641

Sie können nicht anrufen getcwd mit einem NULL-Puffer. Gemäß der Opengroup :

Wenn buf ein Null-Zeiger ist, ist das Verhalten von getcwd() nicht spezifiziert.

Außerdem kann getcwd NULL zurückgeben, was einen String-Konstruktor zerstören kann.

Sie müssen das in etwas wie ändern:

char buffer[SIZE];
char *answer = getcwd(buffer, sizeof(buffer));
string s_cwd;
if (answer)
{
    s_cwd = answer;
}

3voto

Matthew Flaschen Punkte 266507

Aufruf von getcwd mit einem NULL-Zeiger ist durch die Implementierung definiert. Oft wird die Zuweisung für Sie mit malloc durchgeführt (in diesem Fall hat Ihr Code ein Speicherleck). Es ist jedoch nicht garantiert, dass es überhaupt funktioniert. Sie sollten also Ihren eigenen Puffer zuweisen.

char *cwd_buffer = malloc(sizeof(char) * max_path_len);
char *cwd_result = getcwd(cwd_buffer, max_path_len);

Die Open Group hat ein Beispiel, das zeigt, wie man die maximale Pfadlänge von _PC_PATH_MAX erhält. Sie könnten die Verwendung von MAX_PATH unter Windows. Siehe diese Frage für Vorbehalte gegenüber dieser Zahl auf beiden Plattformen.

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