Créer un nouveau répertoire en C
-
Utilisez la fonction
mkdir
pour créer un nouveau répertoire -
Utilisez la fonction
mkdirat
pour créer un nouveau répertoire
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);
}
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