Partage
  • Partager sur Facebook
  • Partager sur Twitter

Parcourir dossier et sous dossier.

Sujet résolu
    2 janvier 2008 à 12:33:30

    Bonjour,
    Je suis actuellement sur la création d'un utilitaire de mise à jour.
    L'updater fonctionne avec un fichier xml contenant les noms de chaque fichier et chaque version.
    Le problème c'est qu'un programme arrive souvent à des centaines de fichiers donc je voudrais faire un créateur de fichier xml automatique.
    Je sais faire du xml en C avec TinyXml mais je voudrais donc faire une boucle qui explore chaque dossier et à chaque fichier trouvé, il met une nouvelle entrée dans le fichier xml.
    Savez vous comment faire ?

    Merci d'avance.

    Gp2mv3
    • Partager sur Facebook
    • Partager sur Twitter
      2 janvier 2008 à 13:15:48

      Si je comprends bien tu veux à partir d'un dossier de ton choix pouvoir en explorer le contenu et si il y a des dossiers dans celui-ci les explorer à leur tour.

      Déjà, je ne sais pas si tu sais comment lire le contenu des dossier alors je te passe un lien t'expliquant cela bien mieux que moi : Lire le contenu d'un dossier

      Sinon moi je vois ton problème ainsi :

      Dans un premier temps tu parcours le dossier de départ et tu stockes si il y a lieu les chemins des dossiers qu'il peut contenir.
      Une fois la lecture du premier dossier fini tu passes au premier dossier stocké et tu fais de même que précédemment.
      Tu répètes le schéma précédent autant qu'il le faudra.

      Exemple si tu as une arborescence comme celle-ci :

      1. C:.
      2. └───dossier1
      3.     ├───d1
      4.     │   └───Exemple
      5.     └───d2



      Tu liras le contenu du dossier "C" puis tu stockes le chemin de dossier1. Une fois l'exploration de C finie tu explores le contenu du dossier "dossier1" et là tu stockeras le chemin d1 et d2.
      ... je te laisse continuer

      Au final tu as :

      1. dossier1
      2. d1
      3. d2
      4. Exemple


      Soit tu stockes le chemin absolu soit tu stockes le chemin relatif à toi de voir.

      Je ne sais pas si j'ai été clair.

      • Partager sur Facebook
      • Partager sur Twitter
        2 janvier 2008 à 13:29:07

        Oui c'est bien comme sa que je voulais m'y prendre.
        Je vais aller voir le lien que tu m'as donné et je te dis quoi. ;)
        Merci.
        • Partager sur Facebook
        • Partager sur Twitter
          2 janvier 2008 à 14:50:39

          J'ai réussi à mettre en place ce dont je t'ai parlé plus haut. Donc si jamais tu as des soucis de réalisation ou de conception, demande et je tâcherais de t'expliquer au mieux ce que j'ai fait.

          Par contre, mon code et mon algorithme n'est pas ce qu'il y de meilleur. J'en suis conscient mais c'est une réponse à la question que tu as posé.

          Si tu veux dans la soirée je posterais mon code commenté et un peu plus otpimisé.
          • Partager sur Facebook
          • Partager sur Twitter
            2 janvier 2008 à 15:27:48

            A ta place je ne coderais pas ca en C; j'utiliserais plutot un script avec la commande unix "find" pour avoir la liste de fichiers et j'effectuerais un petit parsing en perl pour convertir en xml ;)
            • Partager sur Facebook
            • Partager sur Twitter
              2 janvier 2008 à 15:32:33

              Il est certain qu'il y a des choix bien meilleur que celui de le coder en C. Mais étant donné que ça question se trouve dans la partie C du forum on se doit de l'aiguiller aussi sur la partie C et algorithmique de son problème. Mais aussi comme tu l'as fait sur une solution bien plus performante.
              • Partager sur Facebook
              • Partager sur Twitter
                2 janvier 2008 à 16:10:34

                Citation : aurek

                Mais aussi comme tu l'as fait sur une solution bien plus performante.


                Pas tout a fait. ;) L'algo que tu as decrit est le seul qui permette de faire correctement le travail demandé. Si gp2mv3 peut mettre ca en place en C avec une gestion exhaustive de toutes les erreurs possibles alors ce sera la solution la plus performante avec l'avantage de pouvoir etre integree directement dans un programme C.
                Meme si les langages interpretés sont moins performants que les langages compilés, leur atout est de pouvoir faire ce genre de choses en une ligne de code :D
                • Partager sur Facebook
                • Partager sur Twitter
                  2 janvier 2008 à 18:37:32

                  J'ai réussi à le mettre en place mais j'ai utilisé dirent.h.
                  Voici le code pour les intéressés :
                  1. #include <stdio.h>
                  2. #include <sys/types.h>
                  3. #include <dirent.h>
                  4. #include <string.h>
                  5. int ligne = -1;
                  6. int explore(char dir[50])
                  7. {
                  8. struct dirent *lecture;
                  9. DIR *rep;
                  10. rep = opendir(dir);
                  11. char ssdir[50];
                  12. ligne++;
                  13. int i;
                  14. while ((lecture = readdir(rep)))
                  15. {
                  16.    if (strcmp(lecture->d_name, ".") != 0 && strcmp(lecture->d_name, "..") != 0)
                  17.    {
                  18.     if (strpbrk(lecture->d_name, ".") == NULL)
                  19.     {
                  20.       for (i = 0 ; i < ligne ; i++)
                  21.       {
                  22.        printf(" ");  
                  23.       }
                  24.       printf(" DOSSIER: %s\n", lecture->d_name);  
                  25.       sprintf(ssdir, "%s/%s", dir, lecture->d_name);
                  26.       explore(ssdir);
                  27.     }                          
                  28.     else
                  29.     {                                                      
                  30.       for (i = 0 ; i < ligne ; i++)
                  31.       {
                  32.        printf(" ");  
                  33.       }
                  34.       printf("FICHIER: %s\n", lecture->d_name);
                  35.     }
                  36.    }
                  37. }
                  38. closedir(rep);
                  39. }
                  40. int main(void)
                  41. {
                  42. explore("");
                  43. system("PAUSE");
                  44. return 0;
                  45. }

                  Si il y a un petit mélange de C/C++, c'est parce que je code souvent en C++ et j'en suis désoler si ça compromet la lecture du code. ;)

                  Merci de votre aide.

                  Gp2mv3
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 janvier 2008 à 19:06:40

                    Si jamais tu as un nom de dossier avec un point ton programme ne marche plus. Il ne le voit plus comme un dossier mais simplement comme un fichier.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 janvier 2008 à 19:10:23

                      Oui je sais, c'est le seul inconvénient de cette solution je pense mais en même temps, c'est juste pour une utilité privée donc j'ai cas éviter de faire des . dans les dossiers. ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 janvier 2008 à 19:13:08

                        En même temps vu sous êtes angles il est vrai que ça simplifie pas mal de chose.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 janvier 2008 à 19:13:57

                          Oui, je ne voulais pas y passer longtemps, ce n'est pas le centre de mon programme. :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 janvier 2008 à 19:20:07

                            Voilà ma proposition qui fonctionne avec des noms de dossier avec des points. Par contre celle-ci ne fait pas comme la tienne, elle supprime l'arborescence. Elle se contente de lister les fichiers qu'elle peut trouver :

                            1. #include <stdio.h>
                            2. #include <string.h>
                            3. #include <sys/types.h>
                            4. #include <dirent.h>
                            5. int lireRep(char *nom, char t[][50], int indice, int taille);
                            6. int lireRep(char *nom, char t[][50], int indice, int taille)
                            7. {
                            8.     struct dirent *lecture;
                            9.     DIR *rep;
                            10.     char temp[50] = "";
                            11.     int i = indice;
                            12.     rep = opendir(nom);
                            13.     if(rep == NULL)
                            14.         return -1;
                            15.     while ((lecture = readdir(rep)))
                            16.     {
                            17.         sprintf(temp,"%s/%s", nom, lecture->d_name);
                            18.         if(opendir(temp) != NULL)
                            19.         {
                            20.             if(strcmp(lecture->d_name, ".") == 0 || strcmp(lecture->d_name, "..") == 0)
                            21.                 continue;
                            22.             else
                            23.             {
                            24.                 strcpy(t[i], temp);
                            25.                 i++;
                            26.                 continue;
                            27.             }
                            28.         }
                            29.         printf("FICHIER: %s\n", lecture->d_name);
                            30.     }
                            31.     closedir(rep);
                            32.     if(indice < i || indice != taille)
                            33.         lireRep(t[indice], t, indice + 1, i);
                            34.     return 0;
                            35. }
                            36. int main(void)
                            37. {
                            38.     char t[50][50], nom[50] = "./C";
                            39.     int indice = 0, ret;
                            40.     ret = lireRep(nom, t, indice, 0);
                            41.     if(ret == -1)
                            42.         printf("Erreur !\n");
                            43.     else
                            44.         printf("Fin de l'exploration!\n");
                            45.     return 0;
                            46. }


                            Cette solution est loin d'être parfaite. Si remarques il y a je suis preneur !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 janvier 2008 à 19:40:11

                              Je retiens ton code, il peut être intéressant aussi mais moi j'ai besoin de l'arborescence, voici un extrait du fichier XML créé :
                              1. <?xml version="1.0" encoding="ISO-8859-1" ?>
                              2. <Fichiers>
                              3.     <fichier name="D3DX81ab.dll" chemin="D3DX81ab.dll" build="1" />
                              4.     <fichier name="Projet1.exe" chemin="Projet1.exe" build="1" />
                              5.     <fichier name="Projet1.exe.Manifest" chemin="Projet1.exe.Manifest" build="1" />
                              6.     <fichier name="Projet1.ico" chemin="Projet1.ico" build="1" />
                              7.     <fichier name="1.mp3" chemin="sons/musiques/1.mp3" build="1" />
                              8.     <fichier name="10.mp3" chemin="sons/musiques/10.mp3" build="1" />
                              9.     <fichier name="2.mp3" chemin="sons/musiques/2.mp3" build="1" />
                              10.     <fichier name="3.mp3" chemin="sons/musiques/3.mp3" build="1" />
                              11. </Fichiers>

                              J'ai mis un extrait parce qu'il y a plus de 300 entrées dedans.
                              Je me suis dit que ça serait plutôt lourd à la lecture. ;)

                              Bien amicalement.

                              Gp2mv3
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Parcourir dossier et sous dossier.

                              × 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