Passage en récurssif d'un programme en C

Fermé
nairolff Messages postés 4 Date d'inscription jeudi 30 avril 2009 Statut Membre Dernière intervention 10 septembre 2009 - 30 avril 2009 à 15:11
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 4 mai 2009 à 08:39
Bonjour,

J'ai écris un programme en C (sur DevCpp) qui permet de lister les fichiers". txt" contenus dans un répertoire racine ; et tout cela en utilisant l'API Windows. Cela fonctionne bien, mais maintenant je souhaiterais que mon programme liste également les fichiers".txt" contenus dans d'éventuels sous-dossiers du dossier racine. J'ai pensé utiliser la récurssivité, mais je n'arrive à construire ce nouveau programme récurssif.

Est-ce-que quelqu'un peut m'aider ?

Merci

Voici mon programme :

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argc, char *argv[])
{

HANDLE hfind;
WIN32_FIND_DATA wfd;

// Initialise la recherche
hfind = FindFirstFile("c:\\MesDocs\\*.o", &wfd);

//Si quelque chose à été trouver
if (hfind != INVALID_HANDLE_VALUE)
{

// Commence la boucle
do
{

// Si ce n'est pas le répertoire courant DOS ...
if (wfd.cFileName[0] != '.')
{
// Affiche le nom du fichier trouver
printf ("%s\n", wfd.cFileName);
}

// Recherche le prochain
}while (FindNextFile(hfind, &wfd));

// Recherche terminer, ferme la recherche
FindClose(hfind);

// C'est terminer!!!
printf ("Recherche terminee\n");

}
else
{
printf ("Aucun fichier trouve\n");
//cout << "Aucun fichier n'a été trouver.\r";

}

system("PAUSE");
return 0;
}
A voir également:

6 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 avril 2009 à 15:23
Je te conseil pour la récursivité de faire déjà une fonction qui prend en argument un dossier et qui sort une liste de fichier.
Ensuite, il ne te restera plus qu'à appeler la fonction depuis la fonction avec en argument tout les répertoires trouver. Et ne pas oublier de faire une condition de sortie.
1
nairolff Messages postés 4 Date d'inscription jeudi 30 avril 2009 Statut Membre Dernière intervention 10 septembre 2009
30 avril 2009 à 15:46
Merci beaucoup !
Je vais essayer, mais je ne comprend pas : dans ma fonction je dois mettre en entrée un type "dossier" ? ça existe?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 avril 2009 à 16:10
pas forcément de "type" dossier, mais déscrivant le dossier, typiquement, une chaine de caractère.
En algo, ça donne :
fonction listage_f(dossier_v,liste_v)
   ajouter à liste_v la liste des fichiers présent dans dossier_v
   pour chaque sdossier, contenu dans dossier_v
      listage_f(sdossier,liste_v)
fin fonction
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
30 avril 2009 à 17:29
Salut,
Dans ta boucle while conditionnée par FindNextFile, tu testes si l'élément est un fichier ou un répertoire.
if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     //c'est un répertoire, donc tu peux relancer ta fonction sur ce répertoire.
}
else {
    //sinon si c'est un fichier .txt, tu affiches.
}
 
Cdlt    
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
--------------------------------------------------------------------------------

Bonjour,

Je suis toujours sur le même problème...
Pour simplifier, je souhaite afficher tous les fichiers (dossiers ou non) à partir d'un répertoire racine.

J'ai essayer d'introduire la récurssivité, mais mon programme ne fonctionne pas : je pense que c'est du au fait que mon "path" est toujours le même à chaque fois que la fonction est appelée.... mais je dois avouer que je m'y perd un peu.

Est-ce-que quelqu'un peut me donner un petit coup de pouce ?

Merci



#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

#define path "C:\\Documents and Settings\\Florian\\Mes documents\\les truc a moi\\epf\\3A\\LanguageC"
#define anti "\\"

// Prototype de la fonction
void RechArborescence(HANDLE hfind);


//____________________Programme principal___________________________________

int main(int argc, char *argv[])
{
// Déclaration des variables
HANDLE hfind;
WIN32_FIND_DATA wfd;
hfind = FindFirstFile(path, &wfd); // Répertoire racine

RechArborescence(hfind);

system("PAUSE");
return 0;
}

//______________Définition de la fonction________________________________

void RechArborescence(HANDLE hfind)
{
// Déclaration des variables
WIN32_FIND_DATA wfd;

if (hfind != INVALID_HANDLE_VALUE)
{
do
{
if (wfd.cFileName[0] != '.')
{
// vérifie si c'est un répertoire ou non
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
printf("c'est un dossier : ");
printf ("%s\n", wfd.cFileName);
// c'est la qu'on introduit notre récursivité
strcat(path,anti);
strcat(path,wfd.cFileName);
RechArborescence(SetCurrentDirectory(path));
}
printf ("%s\n", wfd.cFileName);
}
}while (FindNextFile(hfind, &wfd));

// Recherche terminer, ferme la recherche
FindClose(hfind);
printf ("Recherche terminee\n");
}

else
{
printf ("Aucun fichier trouve\n");
}
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
4 mai 2009 à 08:39
Et ça compile ???
Je suis étonné, à moins que je me trompe dans la fonction strcat. Mais dans tout les cas, il est logique que ça ne fonctionne pas.
Une bonne habitude de programmation (confirmé par l'expérience) est d'éviter un maximum c'est putain de macro ! C'est à dire que si tu peux faire autrement, fait le.
Donc, à la place de "#define path" tu mets "const char* path", et là peut être que ça fonctionnera (si ça ne fonctionne pas, il y a un problème ailleurs)
Il faut bien comprendre que les macro ce n'est que du traitement de texte, lorsque tu écris #define a b le préprocesseur remplacera AVANT compilation toutes les occurrences de "a" par "b" dans le source.
si tu veux vérifier, tu tape "gcc -E nomfichier.c" et tu verra à quoi ressemble ton code source.
0