Créer un nouveau répertoire en C


96

Je veux écrire un programme qui vérifie l'existence d'un répertoire; si ce répertoire n'existe pas, il crée le répertoire et un fichier journal à l'intérieur, mais si le répertoire existe déjà, il crée simplement un nouveau fichier journal dans ce dossier.

Comment ferais-je cela en C avec Linux?


1
La fonction mkdir crée un nouveau répertoire, blog.tremend.ro/2008/10/06/…
fsonmezay

1
c'est peut-être parce que vous pouvez trouver la solution dans google ou même ici en effectuant une simple recherche stackoverflow.com/search?q=C+make+directory . Au fait, je ne suis pas celui qui a voté contre.
fsonmezay

Veuillez modifier votre question pour afficher le code que vous avez jusqu'à présent . Vous devez inclure au moins un aperçu (mais de préférence un exemple reproductible minimal ) du code avec lequel vous rencontrez des problèmes, puis nous pouvons essayer de vous aider avec le problème spécifique. Vous devriez également lire Comment demander .
Toby Speight

Réponses:


146

Regardez statpour vérifier si le répertoire existe,

Et mkdir, pour créer un répertoire.

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

Vous pouvez consulter le manuel de ces fonctions avec les commandes man 2 statet man 2 mkdir.


5
Je crois que mkdirsous Linux a besoin d'un deuxième paramètre mode, en plus de path.
Paul R

1
@Uku: passer un nombre incorrect de paramètres à une fonction est un comportement indéfini, donc même si cela peut sembler fonctionner pour vous dans un cas, vous ne devez pas vous y fier.
Paul R

3
À quoi sert de vérifier que le répertoire n'existe pas avant de le créer? Même si stat dit qu'il n'existe pas encore, un autre processus aurait pu le créer entre-temps.
Brandin

2
@Brandin Je suppose que j'ai répondu aveuglément à la question d'OP :) Vous avez raison sur la condition de la race.
Arnaud Le Blanc

4
Cela sera signalé par la plupart des bons analyseurs statiques comme un risque
TOCTOU

22

Vous pouvez utiliser mkdir:

$ homme 2 mkdir

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

int result = mkdir("/home/me/test.txt", 0777);

Cela supprimera et remplacera-t-il les répertoires existants?
jjxtra

@jjxtra :: non, il devrait échouer si le répertoire existe déjà, de la même manière que si vous aviez tenté la même opération depuis la ligne de commande.
Paul R

C'est ce que j'aurais deviné. Un problème de performance en sautant la vérification des statistiques et juste mkdir à chaque fois?
jjxtra

@jjxtra: à moins que vous ne créiez des milliers de répertoires, je ne peux pas imaginer qu'il y aurait une différence de performance mesurable.
Paul R

7

Je veux écrire un programme qui (...) crée le répertoire et un fichier (...) à l'intérieur

car c'est une question très courante, voici le code pour créer plusieurs niveaux de répertoires et ensuite appeler fopen. J'utilise une extension gnu pour imprimer le message d'erreur avec 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);
}

3
juste mes 5 cents - le mode 0777 pour dir peut ne pas être souhaité - peut-être 0755 est-il meilleur, ou même passer par paramètre?
ivan.ukr
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.