Partage
  • Partager sur Facebook
  • Partager sur Twitter

FindFirstFile / FindNextFile : Comportement bizarre...

Problème pour lister les fichiers d'un dossier

Sujet résolu
    22 mai 2006 à 20:58:10

    Bonsoir à tous, dans le but de lire aléatoirement un fichier mp3 d'un dossier donné (ici le répertoire courant) je remplit un tableau avec les noms des fichiers récuperés grâce à FindFirstFile et FindNextFile disponible dans windows.h et qui nous donne un enregistrement WIN32_FIND_DATA ou est stocker le nom du fichier dans le champs cFileName.
    D'après ce que j'ai pu lire sur c'est fonction il suffierait de faire une boucle de FindNextFile après un FindFirstFile pour récuperer tous les fichiers voici le code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    int main(int argc, char *argv[])
    {
            int i=0,nbc=0;
            char** chanson;
            char* rech = "*.mp3";
            HANDLE hfind; // identificateur de la recherche
            WIN32_FIND_DATA wfd; // infos du fichier trouvé par la recherche

            /* Ci-dessous on compte le nombre de fichiers trouvé par la recherche dans le but d'une allocation dynamique du tableau chanson */
            hfind = FindFirstFile (rech, &wfd );
            while(FindNextFile(hfind,&wfd)){
                    nbc++;
            }
            chanson = malloc((nbc+1)*50*sizeof(char));
            nbc=0;

            /* On effectu la recherche en remplissant notre tableau */
            hfind = FindFirstFile (rech, &wfd );
            chanson[nbc]=wfd.cFileName;
            printf("chanson[%d] vaut %s\n",nbc,chanson[nbc]);
            nbc++;
            while(FindNextFile(hfind,&wfd)){
                    chanson[nbc]=wfd.cFileName;
                    printf("chanson[%d] vaut %s\n",nbc,chanson[nbc]); // Pour voir ce que vallent les différentes cases du tableau après leurs affectations
                    nbc++;
            }
            chanson[nbc]=NULL; // On met NULL à la fin du tableau
            CloseHandle(hfind);

            /* Juste pour voir ce qu'il y a dans notre tableau faisons un printf */
            while(chanson[i]!=NULL){
                    printf("chanson[%d] vaut %s\n",i,chanson[i]);
                    i++;
            }
    return EXIT_SUCCESS;
    }


    Voici maintenant (et c'est ce qui pause problème ^^ ) le résultat de ce code:

    chanson[0] vaut 05 Face.mp3
    chanson[1] vaut 01 brainstorm (BIG Muff).mp3
    chanson[2] vaut 02 Spice Of Life.mp3
    chanson[3] vaut 03 Mad House.mp3
    chanson[4] vaut 04 SLY.mp3
    chanson[5] vaut 06 Lost Melody.mp3
    chanson[6] vaut 07 Follow Me.mp3
    chanson[0] vaut 07 Follow Me.mp3
    chanson[1] vaut 07 Follow Me.mp3
    chanson[2] vaut 07 Follow Me.mp3
    chanson[3] vaut 07 Follow Me.mp3
    chanson[4] vaut 07 Follow Me.mp3
    chanson[5] vaut 07 Follow Me.mp3
    chanson[6] vaut 07 Follow Me.mp3


    Mon tableau à bien un état différent à chaque passage de la boucle mais une foit celle-ci terminée toutes les cases contiennent la dernière valeur affectée...
    J'aimerais donc savoir pourquoi ça me donne cela et si il y a un moyen d'obtenir ce que je veux ou si il existe d'autres fonctions pour récupperer les noms des fichiers ayant pour extension mp3 et de les stocker dans un tableau (ordonné ou non cela ne m'interesse pas ^^ ).
    Merci de bien vouloir m'aider :( .
    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2006 à 8:04:01

      Bonjour,

      #include <stdlib.h>
      #include <stdio.h>
      #include <windows.h>
      int main(int argc, char *argv[])
      {
         int i=0,nbc=0, len;
         char** chanson;
         char* rech = "*.mp3";
         HANDLE hfind; // identificateur de la recherche
         WIN32_FIND_DATA wfd; // infos du fichier trouvé par la recherche

         /* Ci-dessous on compte le nombre de fichiers trouvé par la recherche dans le but d'une allocation dynamique du tableau chanson */
         hfind = FindFirstFile (rech, &wfd );
         if (hfind == INVALID_HANDLE_VALUE)
         {
            printf("Aucune chanson trouvée\n");
            return EXIT_SUCCESS;
         }
         nbc++;
         while(FindNextFile(hfind,&wfd))
            nbc++;
         FindClose(hfind);
         // Allocation du tableau de pointeurs
         chanson = malloc(nbc * sizeof(char*));
         nbc=0;

         /* On effectu la recherche en remplissant notre tableau */
         hfind = FindFirstFile (rech, &wfd);
         len = strlen(wfd.cFileName) + 1;
         // Allocation de tableau de char pour stocker la chaine
         chanson[nbc] = malloc(len * sizeof(char));
         // Copie de la chaine
         strcpy(chanson[nbc], wfd.cFileName);
         printf("chanson[%d] vaut %s\n",nbc,chanson[nbc]);
         nbc++;
         while(FindNextFile(hfind,&wfd))
         {
            len = strlen(wfd.cFileName) + 1;
            // Allocation de tableau de char pour stocker la chaine
            chanson[nbc] = malloc(len * sizeof(char));
            // Copie de la chaine
            strcpy(chanson[nbc], wfd.cFileName);
            printf("chanson[%d] vaut %s\n",nbc,chanson[nbc]); // Pour voir ce que vallent les différentes cases du tableau après leurs affectations
            nbc++;
         }
         chanson[nbc]=NULL; // On met NULL à la fin du tableau
         FindClose(hfind);

         /* Juste pour voir ce qu'il y a dans notre tableau faisons un printf */
         while(chanson[i]!=NULL)
         {
            printf("chanson[%d] vaut %s\n",i,chanson[i]);
            i++;
         }
         // Libération des ressources
         i = 0;
         while (chanson[i]!=NULL)
            free(chanson[i++]);
         free(chanson);

         return EXIT_SUCCESS;
      }

      En gros les erreurs :
      Pas de vérification du retour de FindFirstFile
      Mauvaise affectation du tableau de chaines de caractères (et oui c'est une tableau de pointeur sur caractères)
      Fermeture de avec FindClose et non CloseHandle (extrait de la doc de Win32 Prog ref : Use CloseHandle to close handles returned by calls to the CreateFile function. Use FindClose to close handles returned by calls to the FindFirstFile function.)
      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2006 à 18:58:43

        Bonsoir, merci pour ta réponse ça marche très bien maintenant :)
        • Partager sur Facebook
        • Partager sur Twitter
          24 mai 2006 à 11:33:05

          Bonjour,

          je viens de me rendre compte que mon code comporte une erreur, il faut le modifier comme ci-dessous:
             // Allocation du tableau de pointeurs
             chanson = malloc((nbc + 1) * sizeof(char*));


          Pourquoi : Parce que nous terminons notre tableau par l'ajout d'un pointeur nul.
          donc il faut bien nbc pointeur pour stocker les noms de fichiers et un pointeur en plus pour le pointeur nul de fin de tableau. Sans la modification du code, lors de l'execution du code suivant on ecrit en dehors des limite du tableau.
          chanson[nbc]=NULL; // On met NULL à la fin du tableau
          • Partager sur Facebook
          • Partager sur Twitter

          FindFirstFile / FindNextFile : Comportement bizarre...

          × 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