Afficher une arborescence et le nombre d'octet associé

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Afficher une arborescence et le nombre d'octet associé

par Rockleader » 20 Mar 2014, 11:58

Le but de la fonction est spécifié dans le titre du topic.


J'ai réalisé les fonctions; mais j'ai un soucis à l'exécution que je n'arrive pas à régler.


Qu'en pensez vous ?

main
Code: Tout sélectionner
int main(int argc,char** argv)
{
   if(argc != 2)
   {
      fprintf(stderr, "Usage %s REP\n",argv[0]);
      exit(1);
   }
   struct stat Info;
   if(stat(argv[1],&Info)!=0)
   {
      fprintf(stderr, "Erreur stat\n");
   }
   if(S_ISDIR(Info.st_mode)==0) /*Si c'est un fichier*/
   {
      fprintf(stderr, "Erreur %s n'est pas un répertoire !\n",argv[1]);
      octetParfichier(argv[1]);
   }
   else
   {
      octetParfichier(argv[1]);
   }
   return 0;
}


Et la fonction

Code: Tout sélectionner
void octetParfichier(char* R)
{
   struct dirent* cour;
   struct stat Info;
   printf("OK\n");
   DIR* d=opendir(R);
   if(d==NULL)
   {
      fprintf(stderr, "Erreur ouverture répertoire courant\n");
      exit(3);
   }
   int nbOctet=0;
   while((cour=readdir(d))!=NULL)
         {
            if(stat(cour->d_name,&Info)!=0)
            {
               fprintf(stderr, "Erreur stat\n");
            }
            else
            {
               if(S_ISDIR(Info.st_mode)!=0) /*Si c'est un répertoire*/
               {
                  strcat(cour->d_name,"/");
                  strcat(R,cour->d_name);
                  octetParfichier(R);
               }
               else /*si c'ets un fichier*/
               {
                  nbOctet=nbOctet+Info.st_size;
                  printf("%s  %8ld octets \n",R,Info.st_size);
               }
            }
         }
      printf("Total %d octets",nbOctet);
      closedir(d);
   }



On cherche donc à afficher le chemin menant à un fichier et pour chaque répertoire le nombre total d'octet présent dans les fichiers de chaque sous répertoire.


Lorsque je fais un test sur une arborescence

TEST/TEST2/test3.txt


La fonction se lance bien récursivement sur les 2 premiers dossier; mais arrivé sur le fichier elle tente de se relancer récursivement d'après ce que j'ai pu observer; alors qu'il n'y a aucune raison que cela agisse de cette façon.

Qu'en pensez vous ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 20 Mar 2014, 12:24

Bonjour,

Je pense que tu as une erreur de raisonnement.

Remplace la ligne :
Code: Tout sélectionner
printf("OK\n");

par
Code: Tout sélectionner
printf("%s\n", R);

dans ta fonction octetParFichier.

Tu verras très rapidement ce qui ne va pas.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 20 Mar 2014, 13:32

REP
REP./
Erreur ouverture répertoire courant



Hum effectivement; ça me semble pas super logique; mais au moins le problème est clair =)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 20 Mar 2014, 13:34

Ton problème vient sûrement d'ici =) :

Code: Tout sélectionner
if(S_ISDIR(Info.st_mode)!=0) /*Si c'est un répertoire*/
{
   strcat(cour->d_name,"/"); 
   strcat(R,cour->d_name);
   octetParfichier(R);
}


Il faut faire attention avec les strcat car la mémoire allouée n'est pas toujours suffisante pour concaténer des chaines.

Rajoute peut-être :


Code: Tout sélectionner
if(S_ISDIR(Info.st_mode)!=0) /*Si c'est un répertoire*/
{
   printf("dname : %s\n", cour->d_name); 
   octetParfichier(R);
}


Pour voir ce qui s'affiche =).

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 16:31

par joel76 » 20 Mar 2014, 18:19

Code: Tout sélectionner
if(S_ISDIR(Info.st_mode)!=0) /*Si c'est un répertoire*/
{
   strcat(cour->d_name,"/"); 
   strcat(R,cour->d_name);
   octetParfichier(R);
}
Oui, il n'est pas judicieux du tout de modifier des données "sytème" (strcat(cour->d_name, "/"))
Il vaut mieux faire
Code: Tout sélectionner
if(S_ISDIR(Info.st_mode)!=0) /*Si c'est un répertoire*/
{
      strcat(R,cour->d_name);
    strcat(R,"/");
    octetParfichier(R); }
en supposant que R soit assez long !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 10 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite