Obtenir l'annuaire de travail actuel en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction getcwd pour obtenir le répertoire de travail courant
  2. Vérifiez correctement la valeur retournée par la fonction getcwd pour obtenir le répertoire de travail courant en C
  3. Utilisez la fonction get_current_dir_name pour obtenir le répertoire de travail actuel
Obtenir l'annuaire de travail actuel en C

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);
}
Auteur: 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