Crea una nuova directory in C
-
Usa la funzione
mkdir
per creare una nuova directory -
Usa la funzione
mkdirat
per creare una nuova directory
![Crea una nuova directory in C](/img/C/feature-image---mkdir-in-c.webp)
Questo articolo illustrerà più metodi su come creare una nuova directory in C.
Usa la funzione mkdir
per creare una nuova directory
mkdir
è una funzione conforme a POSIX che può essere utilizzata per creare una nuova directory. La funzione accetta due argomenti: il primo dei quali è il puntatore char
che punta al percorso della directory appena creata, e il secondo argomento specifica i bit di autorizzazione, che sono indicati da una maschera di bit e possono essere impostati utilizzando il costanti macro predefinite.
Nell’esempio seguente, dichiariamo una variabile di stringa costante da passare come nome di directory e specifichiamo i bit di modalità S_IRWXU
, il che implica che il proprietario avrà i permessi di lettura / scrittura / esecuzione sulla directory.
#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);
}
Anche se abbiamo inserito la chiamata mkdir
in un codice a linea singola nell’esempio precedente, è importante implementare routine di controllo degli errori quando si lavora con il codice del livello di produzione. All’inizio, dovremmo controllare che sia stata creata una nuova directory e che le sezioni successive del codice possano essere eseguite correttamente se dipendono dalla directory data. Nota che mkdir
restituisce -1
quando si verifica l’errore e imposta errno
di conseguenza. In questo caso, abbiamo implementato un’istruzione switch
per controllare alcuni codici di errore e stampare i messaggi corrispondenti sulla 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);
}
Usa la funzione mkdirat
per creare una nuova directory
mkdirat
è un’altra chiamata di sistema che funziona in modo simile, tranne per il fatto che richiede tre argomenti. Il primo è il descrittore del file di directory che può essere recuperato con la chiamata di sistema dirfd
. Notare che questo descrittore di file viene utilizzato quando il percorso specificato come secondo argomento è un relativo. In tal caso, il percorso viene interpretato in relazione alla directory data piuttosto che alla directory di lavoro corrente.
mkdirat
ha gli stessi valori del tipo restituito dei valori mkdir
e errno
possono essere controllati di conseguenza (vedere l’lista completo in questa pagina). Il codice di esempio seguente tenta di creare una nuova directory nella directory precedente a quella corrente.
#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