Obtenir l'annuaire de travail actuel en C
-
Utiliser la fonction
getcwd
pour obtenir le répertoire de travail courant -
Vérifiez correctement la valeur retournée par la fonction
getcwd
pour obtenir le répertoire de travail courant en C -
Utilisez la fonction
get_current_dir_name
pour obtenir le répertoire de travail actuel
Cet article explique plusieurs méthodes pour obtenir le répertoire de travail actuel en C.
Utiliser la fonction getcwd
pour obtenir le répertoire de travail courant
La fonction getcwd
est un appel système compatible POSIX qui peut récupérer le répertoire de travail actuel du programme appelant. getcwd prend deux arguments - le tampon char*
où le nom du chemin est stocké et le nombre d’octets alloués dans le tampon donné. La fonction stocke le nom du répertoire de travail courant sous la forme d’une chaîne à terminaison nulle et l’utilisateur est responsable de garantir que l’adresse char*
a suffisamment d’espace pour le nom du chemin. Notez que getcwd
renvoie le nom de chemin absolu du répertoire.
#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);
}
Vérifiez correctement la valeur retournée par la fonction getcwd
pour obtenir le répertoire de travail courant en C
La fonction getcwd
peut ne pas récupérer la valeur correcte ; ainsi, dans de tels cas, elle renvoie NULL
et met errno
avec les codes d’erreur correspondants. L’utilisateur est responsable de la mise en œuvre du code de vérification des erreurs et de la modification du flux de contrôle du programme selon les besoins d’un scénario donné. Notez que nous mettons explicitement errno
à zéro avant l’appel de la fonction getcwd
car il est préférable de le faire avant d’appeler à la bibliothèque les fonctions qui promettent de mettre errno
. errno
est mis à ERANGE
si l’argument size est inférieur au nom du chemin du répertoire de travail.
#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);
}
Alternativement, nous pouvons passer la valeur NULL
comme premier argument à la fonction getcwd
et 0
comme second argument. La fonction elle-même allouera un tampon suffisamment grand dynamiquement en utilisant malloc
et retournera le pointeur char
à l’emplacement. Notez que l’utilisateur doit appeler la fonction free
sur le pointeur retourné pour désallouer la mémoire tampon.
#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);
}
Utilisez la fonction get_current_dir_name
pour obtenir le répertoire de travail actuel
get_current_dir_name
est une autre fonction qui peut récupérer le répertoire de travail courant. Notez que cette fonction nécessite la définition de la macro _GNU_SOURCE
; au contraire, le code lancera probablement une erreur de compilation. La fonction get_current_dir_name
ne prend aucun argument et retourne un pointeur char
similaire à la fonction getcwd
. La mémoire est allouée automatiquement en utilisant malloc
, et le code de l’appelant est responsable de la libération du pointeur retourné.
#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