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?

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;
}

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.


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.


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;
}

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.


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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.