Crear un nuevo directorio en C

Jinku Hu 12 octubre 2023
  1. Utilice la función mkdir para crear un nuevo directorio
  2. Utilice la función mkdirat para crear un nuevo directorio
Crear un nuevo directorio en C

Este artículo demostrará varios métodos sobre cómo crear un nuevo directorio en C.

Utilice la función mkdir para crear un nuevo directorio

mkdir es una función compatible con POSIX que se puede utilizar para crear un nuevo directorio. La función toma dos argumentos: el primero de los cuales es el puntero char que apunta al nombre de la ruta del directorio recién creado, y el segundo argumento especifica los bits de permiso, que se indican mediante una máscara de bits y se pueden establecer mediante el constantes macro predefinidas.

En el siguiente ejemplo, declaramos una variable de cadena constante para pasar como un nombre de directorio y especificamos los bits del modo S_IRWXU, lo que implica que el propietario tendrá permisos de lectura/escritura/ejecución en el directorio.

#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);
}

Aunque colocamos la llamada mkdir en un código de una sola línea en el ejemplo anterior, es importante implementar rutinas de verificación de errores cuando se trabaja con el código de nivel de producción. Al principio, debemos verificar que se crea un nuevo directorio y que las secciones posteriores del código se pueden ejecutar con éxito si dependen del directorio dado. Tenga en cuenta que mkdir devuelve -1 cuando se produce el error y establece errno en consecuencia. En este caso, implementamos una declaración switch para verificar algunos códigos de error e imprimir los mensajes correspondientes en la consola.

#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);
}

Utilice la función mkdirat para crear un nuevo directorio

mkdirat es otra llamada al sistema que opera de manera similar, excepto que toma tres argumentos. El primero es el descriptor del archivo de directorio que se puede recuperar con la llamada al sistema dirfd. Tenga en cuenta que este descriptor de archivo se utiliza cuando el nombre de ruta especificado como segundo argumento es relativo. En ese caso, la ruta se interpreta en relación con el directorio dado en lugar del directorio de trabajo actual.

mkdirat tiene los mismos valores de tipo de retorno que los valores de mkdir y los valores de errno se pueden comprobar en consecuencia (consulte la lista completa en esta página). El siguiente código de ejemplo intenta crear un nuevo directorio en el directorio anterior al actual.

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

Artículo relacionado - C File