Créer un nouveau répertoire en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction mkdir pour créer un nouveau répertoire
  2. Utilisez la fonction mkdirat pour créer un nouveau répertoire
Créer un nouveau répertoire en C

Cet article présente plusieurs méthodes sur la façon de créer un nouveau répertoire dans C.

Utilisez la fonction mkdir pour créer un nouveau répertoire

mkdir est une fonction compatible POSIX qui peut être utilisée pour créer un nouveau répertoire. La fonction prend deux arguments - le premier est le pointeur char pointant vers le chemin du répertoire nouvellement créé, et le deuxième argument spécifie les bits d’autorisation, qui sont désignés par un masque de bits et peuvent être définis à l’aide de la commande constantes de macro prédéfinies.

Dans l’exemple suivant, nous déclarons une variable de chaîne constante à passer en tant que nom de répertoire et spécifions les bits de mode S_IRWXU, ce qui implique que le propriétaire aura des droits de lecture/écriture/exécution sur le répertoire.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *name = "Arbitrary Directory";

int main(void) {
  mkdir(name, S_IRWXU);

  exit(EXIT_SUCCESS);
}

Même si nous mettons l’appel mkdir dans un code sur une seule ligne dans l’exemple précédent, il est important d’implémenter des routines de vérification des erreurs lorsque vous travaillez avec le code de niveau production. Dans un premier temps, nous devons vérifier qu’un nouveau répertoire est créé et que les sections ultérieures du code peuvent s’exécuter avec succès si elles dépendent du répertoire donné. Notez que mkdir renvoie -1 lorsque l’erreur se produit et définit errno en conséquence. Dans ce cas, nous avons implémenté une instruction switch pour vérifier certains codes d’erreur et imprimer les messages correspondants sur la console.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *name = "Arbitrary Directory";

int main(void) {
  errno = 0;
  int ret = mkdir(name, S_IRWXU);
  if (ret == -1) {
    switch (errno) {
      case EACCES:
        printf("the parent directory does not allow write");
        exit(EXIT_FAILURE);
      case EEXIST:
        printf("pathname already exists");
        exit(EXIT_FAILURE);
      case ENAMETOOLONG:
        printf("pathname is too long");
        exit(EXIT_FAILURE);
      default:
        perror("mkdir");
        exit(EXIT_FAILURE);
    }
  }

  exit(EXIT_SUCCESS);
}

Utilisez la fonction mkdirat pour créer un nouveau répertoire

mkdirat est un autre appel système qui fonctionne de la même manière, sauf qu’il prend trois arguments. Le premier est le descripteur de fichier de répertoire qui peut être récupéré avec l’appel système dirfd. Notez que ce descripteur de fichier est utilisé lorsque le chemin spécifié comme deuxième argument est un relatif. Dans ce cas, le chemin est interprété par rapport au répertoire donné plutôt qu’au répertoire de travail courant.

mkdirat a les mêmes valeurs de type de retour que les valeurs mkdir et errno peuvent être vérifiées en conséquence (voir la liste complète sur cette page). L’exemple de code suivant tente de créer un nouveau répertoire dans le répertoire précédent vers le répertoire actuel.

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *name = "Arbitrary Directory";

int main(void) {
  DIR *dir = opendir("../");
  int dfd = dirfd(dir);
  errno = 0;
  int ret = mkdirat(dfd, name, S_IRWXU);
  if (ret == -1) {
    switch (errno) {
      case EACCES:
        printf("the parent directory does not allow write");
        exit(EXIT_FAILURE);
      case EEXIST:
        printf("pathname already exists");
        exit(EXIT_FAILURE);
      case ENAMETOOLONG:
        printf("pathname is too long");
        exit(EXIT_FAILURE);
      default:
        perror("mkdir");
        exit(EXIT_FAILURE);
    }
  }
  closedir(dir);

  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

Article connexe - C File