Wie bekomme ich das aktuelle Verzeichnis in einem C-Programm?

162

Ich mache ein C-Programm, in dem ich das Verzeichnis abrufen muss, aus dem das Programm gestartet wird. Dieses Programm wurde für UNIX-Computer geschrieben. Ich habe nachgeschaut opendir()und telldir(), gibt aber ein telldir()zurück off_t (long int), also hilft es mir wirklich nicht.

Wie kann ich den aktuellen Pfad in einer Zeichenfolge (char-Array) abrufen?

CharlesB
quelle

Antworten:

291

Hast du dir das angeschaut getcwd()?

#include <unistd.h>
char *getcwd(char *buf, size_t size);

Einfaches Beispiel:

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

int main() {
   char cwd[PATH_MAX];
   if (getcwd(cwd, sizeof(cwd)) != NULL) {
       printf("Current working dir: %s\n", cwd);
   } else {
       perror("getcwd() error");
       return 1;
   }
   return 0;
}
Mic
quelle
11
Die Auswahl der wählerischsten Nissen, <errno.h>, erscheint unnötig, und das Programm meldet den Erfolg auch bei einem Fehler über seinen Beendigungsstatus. Ansonsten ein schönes Beispiel.
Jonathan Leffler
21
Oh, und ist es konventioneller, printf (...) anstelle von fprintf (stdout, ...) zu verwenden?
Jonathan Leffler
19
@ JonathanLeffler: Das ist nicht die wählerischste Nisse. Dies ist: int main()sollte sein int main(void).
Keith Thompson
4
Ich würde PATH_MAX von Limits.h anstelle von Magic Number verwenden, wenn ~ 4 KB auf dem Stack kein Problem darstellen.
Jacekmigacz
1
Immer noch nicht vorhanden, sollte Ihr Puffer auch das Zeichenfolgenabschlussbyte / null aufnehmen, daher ist das richtige char cwd[PATH_MAX+1]. Oder wenn Sie nicht gerade mit Puffern belästigt werden können char *buf=getcwd(NULL,0);und wenn Sie fertig sind free(buf)(ab POSIX.1-2001)
bliako
60

Suchen Sie in der Manpage nach getcwd.

CAdaker
quelle
7
@angad lehren einen Mann zu fischen, aber zeigen ihm zumindest den Weg zum See / Meer / Ozean :)
MTK
3
Menschen, die Menschen empfehlen, die versuchen, die weit überlegene Suchmethode Google zu verwenden, sind nicht in Kontakt.
Gbtimmon
3
Code-Snippet : man 3 getcwd. Spaß beiseite, sei nicht anarchonistisch, dieser Beitrag stammt aus dem Jahr 2008, SO waren die Konventionen anders.
Kroltan
2
@gbtimmon Google ist eine Suchmaschine, es ist nicht analog zur Manpage. Es wird schließlich auf die Manpage verweisen.
Ajay Brahmakshatriya
24

Obwohl die Frage mit Unix gekennzeichnet ist, können Benutzer sie auch besuchen, wenn ihre Zielplattform Windows ist, und die Antwort für Windows lautet wie folgt GetCurrentDirectory():

DWORD WINAPI GetCurrentDirectory(
  _In_  DWORD  nBufferLength,
  _Out_ LPTSTR lpBuffer
);

Diese Antworten gelten sowohl für C- als auch für C ++ - Code.

Link, der von user4581301 in einem Kommentar zu einer anderen Frage vorgeschlagen und mit einer Google-Suche "site: microsoft.com getcurrentdirectory" als aktuelle Top-Wahl verifiziert wurde.

Jonathan Leffler
quelle
2
#include <stdio.h>  /* defines FILENAME_MAX */
//#define WINDOWS  /* uncomment this line to use it for windows.*/
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

int main(){
  char buff[FILENAME_MAX];
  GetCurrentDir( buff, FILENAME_MAX );
  printf("Current working dir: %s\n", buff);
  return 1;
}
Jevgenij Kononov
quelle
3
Warum verwenden Sie keine vordefinierten Makros, um Betriebssysteme wie #if defined (_WIN32) || zu erkennen? definiert (_WIN64) || definiert ( WINDOWS )
HaSeeB MiR
1

Beachten Sie, dass dies getcwd(3)auch in Microsoft libc: getcwd (3) verfügbar ist und wie erwartet funktioniert.

Muss mit -loldnames(oldnames.lib, was in den meisten Fällen automatisch erfolgt) verknüpft oder verwendet werden _getcwd(). Die nicht fixierte Version ist unter Windows RT nicht verfügbar.

rvx
quelle
0

Um das aktuelle Verzeichnis abzurufen (in dem Sie Ihr Zielprogramm ausführen), können Sie den folgenden Beispielcode verwenden, der sowohl für Visual Studio als auch für Linux / MacOS (gcc / clang) in C und C ++ funktioniert:

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

#if defined(_MSC_VER)
#include <direct.h>
#define getcwd _getcwd
#elif defined(__GNUC__)
#include <unistd.h>
#endif

int main() {
    char* buffer;

    if( (buffer=getcwd(NULL, 0)) == NULL) {
        perror("failed to get current directory\n");
    } else {
        printf("%s \nLength: %zu\n", buffer, strlen(buffer));
        free(buffer);
    }

    return 0;
}
HaxtraZ
quelle