Creando un nuevo directorio en C

96

Quiero escribir un programa que compruebe la existencia de un directorio; si ese directorio no existe, crea el directorio y un archivo de registro dentro de él, pero si el directorio ya existe, simplemente crea un nuevo archivo de registro en esa carpeta.

¿Cómo haría esto en C con Linux?

Jeegar Patel
fuente
1
La función mkdir crea un nuevo directorio, blog.tremend.ro/2008/10/06/…
fsonmezay
1
tal vez sea porque puede encontrar la solución en google o incluso aquí haciendo una búsqueda simple en stackoverflow.com/search?q=C+make+directory . Por cierto, no soy el tipo que ha votado en contra.
fsonmezay
Por favor, editar su pregunta para mostrar el código que tiene hasta ahora . Debe incluir al menos un esquema (pero preferiblemente un ejemplo mínimo reproducible ) del código con el que tiene problemas, luego podemos intentar ayudarlo con el problema específico. También debería leer Cómo preguntar .
Toby Speight

Respuestas:

146

Mire statpara verificar si el directorio existe,

Y mkdir, para crear un directorio.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat st = {0};

if (stat("/some/directory", &st) == -1) {
    mkdir("/some/directory", 0700);
}

Puedes ver el manual de estas funciones con los comandos man 2 staty man 2 mkdir.

Arnaud Le Blanc
fuente
5
Creo que mkdirbajo Linux se necesita un segundo parámetro, modeademás de path.
Paul R
1
@Uku: pasar un número incorrecto de parámetros a una función es un comportamiento indefinido, por lo que, si bien puede parecer que funciona para usted en un caso, no debe confiar en él.
Paul R
3
¿Cuál es el propósito de comprobar que el directorio no existe antes de crearlo? Incluso si stat dice que aún no existe, otro proceso podría haberlo creado mientras tanto.
Brandin
2
@Brandin Supongo que respondí ciegamente a la pregunta de OP :) Tienes razón sobre la condición de la carrera.
Arnaud Le Blanc
4
Esto será marcado por la mayoría de los buenos analizadores estáticos como un riesgo
TOCTOU
22

Puedes usar mkdir:

$ man 2 mkdir

#include <sys/stat.h>
#include <sys/types.h>

int result = mkdir("/home/me/test.txt", 0777);
Paul R
fuente
¿Esto eliminará y reemplazará los directorios existentes?
jjxtra
@jjxtra :: no, debería fallar si el directorio ya existe, de la misma manera que si hubiera intentado la misma operación desde la línea de comando.
Paul R
Eso es lo que habría adivinado. ¿Algún problema de rendimiento al omitir la verificación de estadísticas y solo mkdir cada vez?
jjxtra
@jjxtra: a menos que esté creando miles de directorios, no puedo imaginar que haya una diferencia de rendimiento medible.
Paul R
7

Quiero escribir un programa que (...) crea el directorio y un archivo (...) dentro de él

debido a que esta es una pregunta muy común, aquí está el código para crear múltiples niveles de directorios y luego llamar a fopen. Estoy usando una extensión GNU para imprimir el mensaje de error con printf.

void rek_mkdir(char *path) {
    char *sep = strrchr(path, '/');
    if(sep != NULL) {
        *sep = 0;
        rek_mkdir(path);
        *sep = '/';
    }
    if(mkdir(path, 0777) && errno != EEXIST)
        printf("error while trying to create '%s'\n%m\n", path); 
}

FILE *fopen_mkdir(char *path, char *mode) {
    char *sep = strrchr(path, '/');
    if(sep) { 
        char *path0 = strdup(path);
        path0[ sep - path ] = 0;
        rek_mkdir(path0);
        free(path0);
    }
    return fopen(path,mode);
}
Jens Harms
fuente
3
solo mis 5 centavos - el modo 0777 para dir puede no ser deseado - tal vez 0755 es mejor, o incluso pasar por parámetro?
ivan.ukr