IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Affichage de la taille de tous les fichiers en utilisant stat() - valeur perdue


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut Affichage de la taille de tous les fichiers en utilisant stat() - valeur perdue
    Bonjour,

    J'écris un petit programme utilisant la fonction stat (et lstat) sous Linux pour afficher des informations sur les fichiers du dossier passé en paramètre. L'une d'entre elles est la taille totale, cependant je me rends compte qu'après un certain point, la variable n'est plus sauvegardée. J'ai cherché pendant des heures mais j'en ai pas trouvé la cause donc je demande votre aide. Voici une partie de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     while ((entry = readdir(dir)) != NULL) {
    printf("Taille Totale : %ld \n", taille);
    printf("Taille Totale2 : %ld \n", tailleTotale);
    char path[1024];
     
     
    if (entry->d_type == DT_DIR) {
     
     
     
    snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
    //snprintf(parent, sizeof(parent), "%s", entry->d_name);
    //printf("%s", parent);
     
    if ( stat( path, &file_stat ) != 0 ) {
    fprintf( stderr, "Failed to stat \"%s\": %s\n",
    file_path, strerror( errno ) );
    }
    file_size = file_stat.st_size;
     
    if (strcmp(entry->d_name, "..") != 0 && premier == 0) {
    tailleTotale += file_stat.st_size;
     
    }
     
    if (strcmp(entry->d_name, ".") != 0) {
    premier ++;
    printf("PREMIER = %d\n", premier);
    }
     
    printf("++++%ld++++1", tailleTotale);
     
    printf("%ld\t%s\n", file_size,entry->d_name);
     
    if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
    continue;
    }
     
    // printf("[%s]\n", entry->d_name);
    backup = tailleTotale;
     
    listdir(path, tailleTotale, compteur);
    } else {
     
    snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
     
    if ( lstat( path, &file_stat ) != 0 ) {
    fprintf( stderr, "Failed to stat \"%s\": %s\n",
    file_path, strerror( errno ) );
    }
     
    /*if ((file_stat.st_mode & S_IFMT) == S_IFLNK) {
    tailleTotale += file_stat.st_size;
    }*/
    if (S_ISLNK(file_stat.st_mode)) printf ("lstat says link\n");
     
    file_size = file_stat.st_size;
    tailleTotale += file_stat.st_size;
    //printf("%ld file_size, %d, tailleTotale", file_size, tailleTotale);
    backup = tailleTotale;
     
     
     
    printf("%ld\t%s\n", file_size,entry->d_name);
     
     
    printf("++++%ld++++2", tailleTotale);
     
    }
    printf("++++%ld+++--3", tailleTotale);
    }
     
     
     
    closedir(dir);
     
    }
    Et ce qui en résulte lors de l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Taille Totale : 0
    Taille Totale : 0
    Taille Totale2 : 0
    ++++65++++165 .
    Taille Totale : 0
    Taille Totale2 : 65
    PREMIER = 1
    ++++65++++14096 ..
    Taille Totale : 0
    Taille Totale2 : 65
    50 fich1.txt
    ++++115++++2++++115+++--3Taille Totale : 0
    Taille Totale2 : 115
    20 fich2.txt
    ++++135++++2++++135+++--3Taille Totale : 0
    Taille Totale2 : 135
    PREMIER = 2
    ++++135++++138 rep1
    Taille Totale : 135
    Taille Totale : 135
    Taille Totale2 : 135
    ++++173++++138 .
    Taille Totale : 135
    Taille Totale2 : 173
    PREMIER = 1
    ++++173++++165 ..
    Taille Totale : 135
    Taille Totale2 : 173
    50 fich3.txt
    ++++223++++2++++223+++--3Taille Totale : 135
    Taille Totale2 : 223 
    50 fich4.txt
    ++++273++++2++++273+++--3++++135+++--3Taille Totale : 0
    Taille Totale2 : 135 <------------------------------- Ici est le problème, la variable s'additionne, mais au mauvais nombre. C'est supposé d'etre 273 pour donner 287 au lieu de 149 à la fin
    lstat says link
    14 lien_symb
    ++++149++++2++++149+++--3[
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Médinoc a été assez succint (mais il n'a pas tort). Si tu veux qu'une fonction puisse modifier une variable venue de l'extérieur, il te faut alors (depuis l'extérieur) passer l'adresse de cette variable à ta fonction (exactement ce que tu fais quand tu appelles scanf()). Et du côté de la fonction, stocker cette adresse dans un pointeur.

    Mais si ta fonction doit juste générer une seule et unique valeur (je pense que c'est le cas avec ce "backup" que tu remplis sans jamais le traiter) alors t'as une autre possibilité: renvoyer la valeur générée. Et du côté de l'appelant, tu récupères simplement ce que ta fonction retourne.

    Exemple simple utilisant la première méthode
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void carre(int *pt) {
    	(*pt)=(*pt) * (*pt);
    }
     
    int main() {
    	int toto=123;
    	carre(&toto);
    	printf("Le carré de 123 est %d\n", toto);
    }

    Et en utilisant la seconde méthode
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int carre(int v) {
    	return v * v;
    }
     
    int main() {
    	int toto=123;
    	printf("Le carré de %d est %d\n", toto, carre(toto));
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut
    Merci de votre aide. Cependant, obtiens une erreur de segmentation lorsque j'essaie de faire comme indiqué (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listdir(path, &tailleTotale, &compteur);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listdir(path, tailleTotale, compteur);
    et avec une signature de fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void listdir(const char *name, off_t *taille, int *compteur)
    Merci

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Oui ben que veux-tu qu'on te dise ? Tu nous prends pour des devins ? On ne sait pas comment est défini "tailleTotale" ni "compteur" et on ne sait rien de la fonction "listDir". Donc t'as un segfault parce que probablement tu passes un pointeur là où il ne faut pas.
    Reprenons mon exemple initial mais rajoutons-lui une fonction intermédiaire inutile mais qui illustrera l'idée
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void carre(int *pt) {
    	(*pt)=(*pt) * (*pt);
    }
     
    int main() {
    	int toto=123;
    	intermediaire(&toto);
    	printf("Le carré de 123 est %d\n", toto);
    }

    C'est cette fonction intermédiaire reçoit maintenant le pointeur de "toto" qu'elle devra passer à "carre()". Donc si elle veut passer ce pointeur à "carre()" comme le pointeur contient déjà l'adresse qu'il faut, c'est le pointeur qu'il faut passer et non son adresse
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void intermediaire(int *pt) {
    	carre(pt);
    }
    Il est certain que si ici je place un "&", j'aurai un segfault. La signature de la fonction finale n'est pas suffisant pour dire "il faut mettre &" ou "il ne faut pas le mettre". C'est plutôt la nature de ce que tu dois lui envoyer qui le défini...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut
    résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/04/2017, 10h08
  2. Script batch trouver tous les fichiers de plus de X taille
    Par quietman dans le forum Windows Serveur
    Réponses: 7
    Dernier message: 15/02/2011, 08h59
  3. [Plugin] Récupérer tous les fichiers *.java d'un workspace
    Par Satch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 02/06/2004, 12h51
  4. Afficher tous les fichiers .htm du dd
    Par neo4010 dans le forum Linux
    Réponses: 3
    Dernier message: 20/01/2004, 13h25
  5. Réponses: 4
    Dernier message: 16/08/2003, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo