Passage en récurssif d'un programme en C
nairolff
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
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;
}
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:
- Passage en récurssif d'un programme en C
- Mettre en veille un programme - Guide
- Passage qwerty azerty - Guide
- Programme demarrage windows - Guide
- Forcer la fermeture d'un programme - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
6 réponses
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.
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.
Merci beaucoup !
Je vais essayer, mais je ne comprend pas : dans ma fonction je dois mettre en entrée un type "dossier" ? ça existe?
Je vais essayer, mais je ne comprend pas : dans ma fonction je dois mettre en entrée un type "dossier" ? ça existe?
pas forcément de "type" dossier, mais déscrivant le dossier, typiquement, une chaine de caractère.
En algo, ça donne :
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
Salut,
Dans ta boucle while conditionnée par FindNextFile, tu testes si l'élément est un fichier ou un répertoire.
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
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");
}
}
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");
}
}
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.
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.