Aktuelles Arbeitsverzeichnis in C abfragen

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion getcwd, um das aktuelle Arbeitsverzeichnis zu ermitteln
  2. Richtiges Überprüfen des von der Funktion getcwd zurückgegebenen Wertes zum Abrufen des aktuellen Arbeitsverzeichnisses in C
  3. Verwenden Sie die Funktion get_current_dir_name, um das aktuelle Arbeitsverzeichnis zu ermitteln
Aktuelles Arbeitsverzeichnis in C abfragen

In diesem Artikel werden verschiedene Methoden erklärt, wie man das aktuelle Arbeitsverzeichnis in C abrufen kann.

Verwenden Sie die Funktion getcwd, um das aktuelle Arbeitsverzeichnis zu ermitteln

Die Funktion getcwd ist ein POSIX-konformer Systemaufruf, mit dem das aktuelle Arbeitsverzeichnis des aufrufenden Programms ermittelt werden kann. getcwd nimmt zwei Argumente entgegen - den char*-Puffer, in dem der Pfadname gespeichert ist, und die Anzahl der im angegebenen Puffer allokierten Bytes. Die Funktion speichert den Namen des aktuellen Arbeitsverzeichnisses als null-terminierte Zeichenkette und der Benutzer ist dafür verantwortlich, dass die char*-Adresse genügend Platz für den Pfadnamen hat. Beachten Sie, dass getcwd den absoluten Pfadnamen des Verzeichnisses zurückgibt.

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

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  getcwd(path, MAX_BUF);
  printf("Current working directory: %s\n", path);

  exit(EXIT_SUCCESS);
}

Richtiges Überprüfen des von der Funktion getcwd zurückgegebenen Wertes zum Abrufen des aktuellen Arbeitsverzeichnisses in C

Die Funktion getcwd kann fehlschlagen, wenn sie den korrekten Wert abruft; daher gibt sie in solchen Fällen NULL zurück und setzt errno mit den entsprechenden Fehlercodes. Es liegt in der Verantwortung des Anwenders, Code zur Fehlerprüfung zu implementieren und den Kontrollfluss des Programms nach Bedarf für ein bestimmtes Szenario zu modifizieren. Beachten Sie, dass wir errno vor dem Aufruf der Funktion getcwd explizit auf Null setzen, da es die beste Praxis ist, dies vor dem Aufruf der Bibliotheksfunktionen zu tun, die versprechen, errno zu setzen. Wenn das Argument size kleiner ist als der Pfadname des Arbeitsverzeichnisses, wird errno auf ERANGE gesetzt.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  if (getcwd(path, MAX_BUF) == NULL) {
    if (errno == ERANGE)
      printf("[ERROR] pathname length exceeds the buffer size\n");
    else
      perror("getcwd");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", path);

  exit(EXIT_SUCCESS);
}

Alternativ können wir den Wert NULL als erstes Argument an die Funktion getcwd übergeben und 0 als zweites Argument. Die Funktion selbst wird einen ausreichend großen Puffer dynamisch mit malloc allokieren und den char-Zeiger auf den Speicherort zurückgeben. Beachten Sie, dass der Benutzer die Funktion free auf den zurückgegebenen Zeiger aufrufen sollte, um den Pufferspeicher wieder freizugeben.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  char *buf = getcwd(NULL, 0);
  if (buf == NULL) {
    perror("getcwd");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", buf);
  free(buf);

  exit(EXIT_SUCCESS);
}

Verwenden Sie die Funktion get_current_dir_name, um das aktuelle Arbeitsverzeichnis zu ermitteln

get_current_dir_name ist eine weitere Funktion, die das aktuelle Arbeitsverzeichnis abrufen kann. Beachten Sie, dass für diese Funktion das Makro _GNU_SOURCE definiert sein muss; andernfalls wird der Code wahrscheinlich einen Kompilierungsfehler auslösen. get_current_dir_name nimmt keine Argumente entgegen und gibt einen char-Zeiger zurück, ähnlich wie die Funktion getcwd. Der Speicher wird automatisch mit malloc alloziert, und der Aufrufer-Code ist für das Freigeben des zurückgegebenen Zeigers verantwortlich.

#define _GNU_SOURCE
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  char *buf = get_current_dir_name();
  if (buf == NULL) {
    perror("get_current_dir_name");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", buf);
  free(buf);

  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook