Aktuelles Arbeitsverzeichnis in C abfragen
-
Verwenden Sie die Funktion
getcwd
, um das aktuelle Arbeitsverzeichnis zu ermitteln -
Richtiges Überprüfen des von der Funktion
getcwd
zurückgegebenen Wertes zum Abrufen des aktuellen Arbeitsverzeichnisses in C -
Verwenden Sie die Funktion
get_current_dir_name
, um das aktuelle Arbeitsverzeichnis zu ermitteln
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);
}
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