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?

Jeegar Patel
la source
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.

Arnaud Le Blanc
la source
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);
Paul R
la source
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);
}
Jens Harms
la source
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