Crea una nuova directory in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione mkdir per creare una nuova directory
  2. Usa la funzione mkdirat per creare una nuova directory
Crea una nuova directory in C

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

Articolo correlato - C File