127 votes

Créer un nouveau répertoire dans C

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 puis-je faire cela en C avec Linux?

1 votes

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

1 votes

Peut-être parce que vous pouvez trouver la solution sur Google ou même ici en faisant une recherche simple stackoverflow.com/search?q=C+make+directory. En passant, je ne suis pas la personne qui a voté négativement.

0 votes

Veuillez modifier votre question pour montrer le code que vous avez jusqu'à présent. Vous devriez 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 pourrons essayer de vous aider avec le problème spécifique. Vous devriez également lire Comment poser une question.

191voto

arnaud576875 Points 35281

Regardez stat pour vérifier si le répertoire existe,

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

#include 
#include 
#include 

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 stat et man 2 mkdir.

9 votes

Je crois que la commande mkdir sous Linux nécessite un deuxième paramètre, mode, en plus de path.

0 votes

Paul R: ce n'est pas obligatoire, cela donne simplement un ID efficace en tant que propriétaire.

0 votes

@Uku Loskit: n'obtiendrez-vous pas une erreur de compilation si vous ne passez qu'un seul paramètre ?

34voto

Paul R Points 104036

Vous pouvez utiliser mkdir :

$ man 2 mkdir

#include 
#include 

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

1 votes

Est-ce que cela supprimera et remplacera les répertoires existants ?

1 votes

@jjxtra:: non, cela 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.

0 votes

Voilà ce que j'aurais deviné. Tout problème de performance en sautant la vérification de l'état et en créant simplement un répertoire à chaque fois ?

11voto

Jens Harms Points 316

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

Parce que 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 afficher 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)
        fprintf(stderr, "erreur lors de la tentative de création de '%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);
}

4 votes

Juste mes 5 cents - le mode 0777 pour le répertoire peut ne pas être souhaité - peut-être 0755 est mieux, ou même passer en paramètre?

2 votes

@ivan.ukr 0777 est correct, le mode sera modifié par le umask des utilisateurs. Par exemple, pour umask 022, cela donne 755 ou pour umask 007, 770.

9voto

ShinyHero Points 23

Pour créer un nouveau répertoire en C, vous pouvez utiliser la fonction mkdir définie dans . Cette fonction nécessite deux arguments : le chemin du nouveau répertoire et les autorisations pour celui-ci.

int mkdir (const char *filename, mode_t mode)

Voici un exemple :

#include 
#include 
#include 
#include 

if (mkdir("/some/directory", S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
    printf("Erreur : %s\n", strerror(errno));
}

Points clés :

  1. Autorisations : L'argument mode dans mkdir spécifie les autorisations du répertoire. Pour une meilleure pratique, il est recommandé d'utiliser un alias entier pour mode. S_IRWXU, S_IRWXG et S_IRWXO représentent les autorisations de lecture, écriture et exécution pour l'utilisateur, le groupe et les autres, respectivement. Dans cet exemple, S_IROTH | S_IXOTH est utilisé à la place de S_IRWXO pour les autres, ce qui permet aux autres de lire et d'exécuter mais pas d'écrire.

  2. Vérification des erreurs : Si mkdir renvoie -1, une erreur s'est produite. En utilisant strerror(errno), vous obtiendrez un message d'erreur lisible par l'humain. Les erreurs courantes incluent le répertoire existant déjà (vérifiez EEXIST dans errno)

  3. Référence de documentation : Pour une meilleure compréhension des bits d'autorisation, vous pouvez consulter la documentation de la Bibliothèque C GNU : Bits d'Autorisation GNU

1voto

levivk Points 23

Voici une version simplifiée du code de Jens Harms qui n'utilise pas de récursion.

FILE * fopen_mkdir(const char *path, const char *mode)
{
    char *p = strdup(path);
    char *sep = strchr(p+1, '/');
    while(sep != NULL)
    {
        *sep = '\0';
        if (mkdir(p, 0755) && errno != EEXIST)
        {
            fprintf(stderr, "erreur lors de la tentative de création de %s\n", p);
        }
        *sep = '/';
        sep = strchr(sep+1, '/');
    }
    free(p);
    return fopen(path, mode);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X