Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Liste fichiers

Lister les fichiers d'un répertoire

    21 janvier 2007 à 15:13:58

    Bonjour à tous. ^^

    Actuellement en train de réaliser un petit programme, je reste bloqué face à un problème. :honte:
    Il me faut supprimer tous (donc pas de masque) les fichiers d'un répertoire, donc pour cela les lister... :-°

    Le problème arrive : Je sais lire, écrire, renomer, supprimer un fichier :soleil: , mais pas lister les fichiers d'un répertoire donné. :'(

    Quelqu'un pourrait m'indiquer la voie à suivre, ou mieux, la solution ? :magicien:


    Merci,
    Gamslink
    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2007 à 15:50:27

      Salut,

      Utilises les fonctions opendir() et associées :
      #include <dirent.h>

      DIR *directory;  /* L'équivalent de FILE, pour les dossiers */
      struct dirent *directory_entry;

      /* On ouvre le dossier. */
      directory = opendir(nom_du_dossier);

      /* On boucle sur le contenu du dossier. */
      while ( (directory_entry = readdir(directory)) != NULL ) {
          printf("%s\n", directory_entry.d_name);
      }

      /* On a fini, on referme. */
      closedir(directory);
      • Partager sur Facebook
      • Partager sur Twitter
        21 janvier 2007 à 16:10:44

        Merci.
        Je vois bien le fonctionnement, mais cela ne compile pas chez moi...
        Apparement, il bloque sur la ligne avec le printf().
        Peut-être le d_name ...

        Je suis sous DevC++
        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2007 à 16:21:22

          Citation : Gamslink

          cela ne compile pas chez moi...



          Quel est le message d'erreur du compilateur ?

          Vérifie la déclaration de la structure dirent dans le fichier dirent.h.
          • Partager sur Facebook
          • Partager sur Twitter
            21 janvier 2007 à 16:28:13


            Citation : Log compilation

            shutdown.c: In function `main':
            shutdown.c:16: error: request for member `d_name' in something not a structure or union
            make.exe: *** [shutdown.o] Error 1



            Ligne 16 : Ligne avec le printf()

            Quand à vérifier la déclaration de structure dans dirent.h...
            je sais pas faire :'(
            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2007 à 17:20:52

              Pour le fichier dirent.h, il doit probablement se trouver dans un sous-dossier (certainement nommé include) du dossier d'installation de Dev-C++.

              [EDIT] OUPS, il y a comme une erreur toute bête dans le code que je t'ai donné...

              readdir() retourne un dirent *, donc un pointeur sur la structure et non la structure elle-même. Pour accéder au champ d_name, utilise directory_entry->d_name.
              • Partager sur Facebook
              • Partager sur Twitter
                21 janvier 2007 à 17:27:39

                salut,
                je pense que tu devrais remplacer
                printf("%s\n", directory_entry.d_name);

                par
                printf("%s\n", directory_entry->d_name);

                car directory_entry est un pointeur
                • Partager sur Facebook
                • Partager sur Twitter
                  21 janvier 2007 à 17:48:32

                  Nickel, Merci à vous 2 ;)

                  Maintenant, pour supprimer...
                  J'ai la fonction, mais je lui rentre quoi comme paramètre dans la boucle while ?

                  int remove(const char* fichierASupprimer);
                  int main()
                  {

                   DIR *directory;  /* L'équivalent de FILE, pour les dossiers */
                  struct dirent *directory_entry;

                  /* On ouvre le dossier. */
                  directory = opendir("C:\\path");

                  /* On boucle sur le contenu du dossier. */
                  while ( (directory_entry = readdir(directory)) != NULL ) {
                  printf("%s\n", directory_entry->d_name);
                  }
                  remove("XXXXXXX");
                  /* On a fini, on referme. */
                  closedir(directory);
                    system("PAUSE");     
                    return 0;
                  }


                  Je lui rentre un C:\\path\\, mais quoi d'autre....? o_O
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 janvier 2007 à 13:15:36

                    Salut,

                    Ça va être un petit peu plus compliqué que tu ne te l'imagines...

                    D'abord, le champ d_name de la structure dirent ne contient pas le chemin d'accès complet du fichier, mais uniquement son nom. Ça veut dire que tu dois concaténer ce nom avec le nom du répertoire d'origine avant de le passer en paramètres à ta fonction remove.

                    Ensuite, il faut tenir compte des sous-dossiers : pour chaque entrée du répertoire, il faut vérifier s'il s'agit d'un sous-dossier et, le cas échéant, il faut ouvrir ce dossier et parcourir toutes ses entrées, etc...

                    Utilise la fonction stat et les macros associées pour déterminer si une entrée de répertoire est un fichier ou un sous-dossier :
                    #include <unistd.h>

                    struct stat statbuffer;
                    stat(directory_entry->d_name, &statbuffer);
                    if ( S_ISDIR(statbuffer) ) {
                        /* d_name est un sous-dossier */
                    } else {
                        /* d_name est un fichier */
                    }

                    • Partager sur Facebook
                    • Partager sur Twitter

                    [C] Liste fichiers

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown