Crie um novo diretório em C

Jinku Hu 12 outubro 2023
  1. Use a função mkdir para criar um novo diretório
  2. Use a função mkdirat para criar um novo diretório
Crie um novo diretório em C

Este artigo demonstrará vários métodos sobre como criar um novo diretório em C.

Use a função mkdir para criar um novo diretório

mkdir é uma função compatível com POSIX que pode ser usada para criar um novo diretório. A função leva dois argumentos - o primeiro dos quais é o ponteiro char apontando para o nome do caminho do diretório recém-criado, e o segundo argumento especifica os bits de permissão, que são denotados por uma máscara de bits e podem ser definidos usando o constantes macro predefinidas.

No exemplo a seguir, declaramos uma variável de string constante a ser passada como um nome de diretório e especificamos os bits de modo S_IRWXU, o que implica que o proprietário terá permissões de leitura / gravação / execução no diretório.

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

Embora tenhamos colocado a chamada mkdir em um código de linha única no exemplo anterior, é importante implementar rotinas de verificação de erros ao trabalhar com o código de nível de produção. Primeiramente, devemos verificar se um novo diretório é criado e as seções posteriores do código podem ser executadas com sucesso se dependerem do diretório fornecido. Observe que mkdir retorna -1 quando o erro ocorre e define errno de acordo. Neste caso, implementamos uma instrução switch para verificar alguns códigos de erro e imprimir as mensagens correspondentes no 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);
}

Use a função mkdirat para criar um novo diretório

mkdirat é outra chamada de sistema que opera de forma semelhante, exceto que leva três argumentos. O primeiro é o descritor do arquivo do diretório que pode ser recuperado com a chamada do sistema dirfd. Observe que este descritor de arquivo é usado quando o nome do caminho especificado como o segundo argumento é um relativo. Nesse caso, o caminho é interpretado em relação ao diretório fornecido em vez do diretório de trabalho atual.

mkdirat tem os mesmos valores de tipo de retorno que os valores mkdir e errno podem ser verificados de acordo (veja a lista completa nesta página). O código de exemplo a seguir tenta criar um novo diretório do diretório anterior para o atual.

#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

Artigo relacionado - C File