IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

effacer un dossier


Sujet :

C

  1. #1
    Membre émérite Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Par défaut effacer un dossier
    Bonjour j'ai une petite question toute bete on peut effacer des fichiers avec "remove(...)" mais pour effacer un dossier quel fonction utiliser!!
    merci jérémy

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Jérémy Lefevre
    mais pour effacer un dossier quel fonction utiliser!
    Il y a bien _rmdir() <dir.h> mais je ne suis pas sûr que ce soit portable.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    si tu es sur *n*x :

    ou en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    statut = system ( "rm -rf dossier");

  4. #4
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par Jérémy Lefevre
    Bonjour j'ai une petite question toute bete on peut effacer des fichiers avec "remove(...)" mais pour effacer un dossier quel fonction utiliser!!
    merci jérémy
    En effet, sur beaucoup d'unixoïdes, remove() était simplement un alias d'unlink avec les libc fournies et ne pouvait donc pas enlever des répertoires. Il y a plusieurs solutions : utiliser explicitement le rmdir() POSIX (http://www.opengroup.org/onlinepubs/...ons/rmdir.html), ou utiliser la fonction remove() conforme POSIX (elle est aussi bien sûr dans la même libc, mais son comportement peut varier selon les options de compilation choisies) qui doit normalement faire appel à rmdir() pour les répertoire.

    A+

  5. #5
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par stephl
    Il y a bien _rmdir() <dir.h> mais je ne suis pas sûr que ce soit portable.
    il y a bien des fonctions POSIX remove() et rmdir() permettant d'accomplir ce que veut le PO, donc je considère que c'est (très) portable (et puis avec la mode la virtualisation en ce moment, pas la peine de faire trop les difficiles). Par contre, je ne connais pas cet entête, <dir.h>, qui n'est pas POSIX apparement.

    A bookmarker obligatoirement pour tout programmeur C :
    http://www.unix.org/single_unix_specification

    A+

  6. #6
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Foobar1329
    Par contre, je ne connais pas cet entête, <dir.h>, qui n'est pas POSIX apparement.
    C'est peut-être un fichier d'en-tête propre à Borland alors.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Non, on trouve dir.h sur différents systèmes Unix indépendament de Borland.

  8. #8
    Membre émérite Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Par défaut
    Alors je me suis penché un petit peu sur rmdir et remove alors le problème est que rmdir efface les dossiers vides donc il faut faire un recurcivité pour effacer le contenu du dossier. sinon j'ai vu qu'il y avait boost avec une fonction remove_all() mais ca m'embete de prendre une librairie pour faire un simple programme qui efface un dossier !!!!!!

  9. #9
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Re,

    Citation Envoyé par Jérémy Lefevre
    Alors je me suis penché un petit peu sur rmdir et remove alors le problème est que rmdir efface les dossiers vides donc il faut faire un recurcivité pour effacer le contenu du dossier. sinon j'ai vu qu'il y avait boost avec une fonction remove_all() mais ca m'embete de prendre une librairie pour faire un simple programme qui efface un dossier !!!!!!
    Surtout que boost est une bibliothèque C++ (c'est peut-être en C++ que tu programmes en même temps). La solution de souviron34 avec un system("rm -rf rep"); est alors envisageable pour faire au plus simple. Maintenant, quand la doc dit que remove() (rmdir()) ne sait qu'enlever des répertoires "vides", j'ai constaté sur plusieurs systèmes (RHL, RHEL, Solaris, AIX entre autres) que la fonction rmdir() savait détruire une arborescence de répertoires "vides" (i.e: que ., .., et éventuellement le nom d'un sous-répertoire ayant la même caractéristique) alors qu'elle est censée positionner errno à ENOTEMPTY d'après la (les) doc(s). A l'inverse, la commande rmdir ne sait détruire que des répertoires vraiment vides (il n'y a que . et ..). Bug de rmdir() ? Je ne sais pas, toujours est-il que le petit programme exemple suivant fonctionne très bien sur ma RHEL 4, RHL 9, ainsi que sur une Mandriva je sais pas quoi, de même qu'il doit fonctionner sur d'autres systèmes POSIX. Tous les fichiers n'étant pas des répertoires sont d'abord détruits dans l'arborescence avant de détruire le répertoire racine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #include <dirent.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/types.h>
     
    int rcs_remove(char const * pathname) {
     
        int rc = 0;
     
        if (pathname) {
     
          DIR * dir = NULL;
          struct dirent * dp = NULL;
          struct stat statinfo;
          char name[1024+1] = { '\0' };
     
          dir = opendir(pathname);
          if (dir) {
     
            if ( chdir(pathname) == -1) {
               fprintf(stderr, "Failed to chdir to %s\n", pathname);
               closedir(dir);
               exit(EXIT_FAILURE);
            }
     
            /* In this loop, recursive call to remove all files which are not directories  */
            while((dp = readdir(dir)) != NULL) {
     
               if (stat(dp->d_name, &statinfo) == -1) {
                 fprintf(stderr, "stat() failed on %s\n", dp->d_name);
                 closedir(dir);
                 exit(EXIT_FAILURE);
               }
     
               if (S_ISDIR(statinfo.st_mode) && strcmp(dp->d_name, "..") && strcmp(dp->d_name, ".") ) {
     
                  size_t lgPath = strlen(pathname);
                  size_t lgDirentry = strlen(dp->d_name);
     
                  printf("I'm a directory: %s\n", dp->d_name);
     
                  if ((lgPath+lgDirentry+1) <= 1024) {
                     strcat(name, pathname);
                     strcat(name,"/");
                     strcat(name, dp->d_name);
                  }
                  else {
                     fprintf(stderr, "Pathname is too long !...Exiting\n");
                     closedir(dir);
                     exit(EXIT_FAILURE);
                  }
     
                  printf("Directory: %s\n", name);
                  rcs_remove(name);
               }
               else if (strcmp(dp->d_name, "..") && strcmp(dp->d_name, ".") ) {
                 printf("I'm another kind of file: %s ... Goodbye, I'm dying, this program removes me...\n", dp->d_name);
                 rc = remove(dp->d_name); 
                 if (rc == -1) {
                    perror("Remove failed");
                    exit(EXIT_FAILURE);
                 }
               }
     
           }
     
           closedir(dir);
     
           /* Finally remove the empty root directory */ 
           rc = remove(pathname);
           if (rc == -1) {
             perror("Remove failed");
             exit(EXIT_FAILURE);
           } 
          }
     
        } else {
          rc = -1;
        }
     
        return rc;
     
    }
     
    int main(void) {
        /*
         Copy and paste the following commands in your shell:
         cd ~
         mkdir foo
         mkdir foo/bar
         mkdir foo/bar/foofoo
         mkdir foo/bar/foofoo/foobar
         echo "Java sucks \! My Eclipse still crashed 5 times today \!" > foo/bar/foofoo/me.txt
         echo "Not at all, Java is good for you" > foo/bar/foofoo/foobar/james.txt
         echo "Why? " >> foo/bar/foofoo/me.txt
         echo "Because you're too bad to program in C." >> foo/bar/foofoo/foobar/james.txt
         
         Check the directories tree with ls -Rl
         
         Compile and run this program. The files tree created above should have been deleted. 
        */
     
        rcs_remove("/home/<you>/foo");
        return EXIT_SUCCESS;
    }
    Si tu tiens vraiment à faire cette tâche par programmation d'une façon plus élaborée qu'un system(), je conseille d'aller jeter un oeil aux sources de rm et rmdir dans GNU fileutils par exemple.

    A+

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ceci peut être un bon exercice de style sous Linux que de faire tout ceci soi même, pour parcourir de façon récursive sous Linux, tu as les fonctions ftw et nftw pour t'aider un peu dans cette tâche. Il ne faut pas non plus oublier que le comportement de pas exemple rmdir et remove sont définies suivant l'implémentation et cela peut donc varier d'un Linux par exemple avec un système BSD ... à faire attention quand on les utilise alors
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. effacer le dossier temp dans php
    Par adel.87 dans le forum Langage
    Réponses: 1
    Dernier message: 25/04/2008, 16h19
  2. Effacer un war sans effacer le dossier déployé
    Par mystar dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 01/06/2007, 01h29
  3. effacer des dossiers dans un répertoire
    Par cortex024 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 16/05/2007, 16h48
  4. Effacer fichier/dossier de + de xjrs
    Par darksnake dans le forum VBScript
    Réponses: 3
    Dernier message: 13/12/2006, 16h50
  5. [langage] effacer un dossier
    Par cedpig dans le forum Langage
    Réponses: 7
    Dernier message: 07/05/2004, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo