Afficher une arborescence et le nombre d'octet associé
Discutez d'informatique ici !
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 19:42
-
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 !
-
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.
-
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 !
-
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 !
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 10 invités