Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#include <stdio.h> #include <malloc.h> #include <string.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include char *testArgChemin; //si option name //-- Fonction recursive qui Affiche le contenu du repertoire --// void parcoursRep(char *rep, char *nomRepPere){ //chaine de caractere a afficher pour chaque entree char *nom; //longueur de cette chaine int nomTaille; //flux repertoire DIR *dir; //une entree du repertoire struct dirent *entree; //structure contenant les informations d'une entree struct stat infosEntree; //indice de defilement dans listeEntrees int n; //nombre d'entre du repertoire int nbEntrees=0; //ouverture du repertoire dir = opendir(rep); //si scandir echoue, message d'erreur et sortie if (dir == NULL){ perror("opendir"); exit(1); } chdir(rep); //on parcours toutes les entrees du repertoire while((entree=readdir(dir))!=NULL){ //on ne traite pas . et .. if((strcmp(entree->d_name,".")!=0)&&(strcmp(entree->d_name,"..")!=0)){ //on va creer la chaine de caractere "rep/nomEntree" pour les fichiers ou "rep/nomEntree/" pour les repertoires nomTaille=strlen(nomRepPere)+strlen(entree->d_name); //ligne * a ajouter //stat rempli le buffer infosEntree avec les information concernant l'entree passe en 1er parametre stat(entree->d_name,&infosEntree); //si c'est un repertoire on incremente la taille de la chaine pour ajouter un separateur en fin de chaine if(S_ISDIR(infosEntree.st_mode)) nomTaille++; //allocation de memoire pour cette chaine !!!A EXTERNALISER!!! nom=(char*)malloc(sizeof(char)*nomTaille+2); //+1 pour le separateur +1 pour m \0 //on concatene le nom du rep a la chaine, puis le separateur, puis le nom de l'entree, puis un dernier separateur s'il s'agit d'un sous rep strcat(nom,nomRepPere); //strcat(nom,"/"); strcat(nom,entree->d_name); if(S_ISDIR(infosEntree.st_mode)) strcat(nom,"/"); //S_ISDR prend en parametre le contenu de st_mode et renvoi 1 si l'entree est un repertoire, on verifie que l'entree est un repertoire et qu'il ne s'agit pas des repertoire "." ou ".." if(S_ISDIR(infosEntree.st_mode)){ chdir(entree->d_name); //on appel recursivement parcoursRep en passant en parametre ce nouveau repertoire rencontre parcoursRep(".",nom); chdir(".."); } //affichage du nom de l'entree //if(strcmp(entree->d_name,testArgChemin)==0){ //faire un si "crieterSatisait(name) printf("%s\n", nom); //} //on libere free(nom); //on peut liberer l'espace reserve a cette entree free (entree); } } } int main(int argc, char *argv[]){ testArgChemin=(char*)malloc(sizeof(char)*4); strcat(testArgChemin,"iop"); parcoursRep(".","./"); }
#include <stdio.h> #include <malloc.h> #include <string.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include //-- Fonction recursive qui Affiche le contenu du repertoire --// void parcoursRep(char *rep, char *nomRepPere){ //chaine de caractere a afficher pour chaque entree char *nom; //longueur de cette chaine int nomTaille; //flux repertoire DIR *dir; //une entree du repertoire struct dirent *entree; //structure contenant les informations d'une entree struct stat infosEntree; //indice de defilement dans listeEntrees int n; //nombre d'entre du repertoire int nbEntrees=0; //ouverture du repertoire dir = opendir(rep); //si scandir echoue, message d'erreur et sortie if (dir == NULL){ perror("opendir"); exit(1); } chdir(rep); //on parcours toutes les entrees du repertoire while((entree=readdir(dir))!=NULL){ //on ne traite pas . et .. if((strcmp(entree->d_name,".")!=0)&&(strcmp(entree->d_name,"..")!=0)){ //on va creer la chaine de caractere "rep/nomEntree" pour les fichiers ou "rep/nomEntree/" pour les repertoires nomTaille=strlen(nomRepPere)+strlen(entree->d_name); //ligne * a ajouter //stat rempli le buffer infosEntree avec les information concernant l'entree passe en 1er parametre stat(entree->d_name,&infosEntree); //si c'est un repertoire on incremente la taille de la chaine pour ajouter un separateur en fin de chaine if(S_ISDIR(infosEntree.st_mode)) nomTaille++; //allocation de memoire pour cette chaine !!!A EXTERNALISER!!! nom=(char*)malloc(sizeof(char)*nomTaille+2); //+1 pour le separateur +1 pour m \0 //on concatene le nom du rep a la chaine, puis le separateur, puis le nom de l'entree, puis un dernier separateur s'il s'agit d'un sous rep strcat(nom,nomRepPere); //strcat(nom,"/"); strcat(nom,entree->d_name); if(S_ISDIR(infosEntree.st_mode)) strcat(nom,"/"); //S_ISDR prend en parametre le contenu de st_mode et renvoi 1 si l'entree est un repertoire, on verifie que l'entree est un repertoire et qu'il ne s'agit pas des repertoire "." ou ".." if(S_ISDIR(infosEntree.st_mode)){ chdir(entree->d_name); //on appel recursivement parcoursRep en passant en parametre ce nouveau repertoire rencontre parcoursRep(".",nom); chdir(".."); } //affichage du nom de l'entree printf("%s\n", nom); //on libere free(nom); //on peut liberer l'espace reserve a cette entree free (entree); } } } int main(int argc, char *argv[]){ parcoursRep(".","./"); }