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 :

Programme équivalent à DIR [Débutant(e)]


Sujet :

C

  1. #41
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    L'utilisation de la macro S_ISDIR(m) n'est pas bonne alors -_-
    Exactement.
    Je vois bien la doc mais dans la version que m'a passé skyrunner j'ai 0 si TRUE ?!
    Pure invention. Prouve le !
    Comment dois-je utiliser la macro ?
    Tu relis l'extrait de la norme POSIX.1 que je t'ai passé. Il n'y a pas plus clair.

  2. #42
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Je suis fatigué (je continuerai demain) sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    S_ISDIR(m) Test for a directory.
    Ne m'indique rien de nouveau.
    (Pouvez-vous me donner un petit code avec une macro imaginaire pour que je comprenne la syntaxe ou méthode ?)

    Et pour la preuve :

    VALEUR RENVOYÉE

    Ces fonctions retournent zéro si elles réussissent. En cas d'echec -1 est renvoyé, et errno contient le code d'erreur.
    Sur : http://man.developpez.com/man2/stat.2.php

  3. #43
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    S_ISDIR(m) Test for a directory.
    Ne m'indique rien de nouveau.
    (Pouvez-vous me donner un petit code avec une macro imaginaire pour que je comprenne la syntaxe ou méthode ?)
    Tu as compris ce que renvoyait la macro ? Il suffit de la placer dans un if (comme un appel de fonction) et c'est tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       if (S_ISDIR(m)) 
          faire ceci
       else
          faire cela...
    je ne vois pas où est la difficulté...
    Et pour la preuve :

    Sur : http://man.developpez.com/man2/stat.2.php
    Ceci concerne la fonction stat(), par exemple. Rien à voir avec les macros...

  4. #44
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci.

    Oui, elle renvoit 0 si c'est faux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(S_ISDIR(infos.st_mode)==0)
       {
                                printf("files");
       }
       else
       {
           printf("folder");
       }
    En fait, m c'est quoi comme type de variable ?

  5. #45
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Oui, elle renvoit 0 si c'est faux :
    Oui,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(S_ISDIR(infos.st_mode)==0)
    mais on ne met pas '== 0', c'est inutile. On met juste if(lamacro(xxx)). Restons simple... Parce un jour tu seras tenté de mettre '== 1' et là boum, ça ne marchera pas. La norme dit "0 ou <>0", il n'y a rien à ajouter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    En fait, m c'est quoi comme type de variable ? :)
    Purée... relis la doc que je t'ai passé (posix.1). Pourquoi a-t-on appelé stat() à ton avis ? Tu penses que la réponse je vais la trouver où ? Apprends à lire la doc. Si tu ne le fais pas, je ne peux rien pour toi, c'est 40 à 50% de ce métier...

  6. #46
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Bon j'ai trouvé la phrase :

    The following macros shall be provided to test whether a file is of the specified type. The value m supplied to the macros is the value of st_mode from a stat structure. The macro shall evaluate to a non-zero value if the test is true; 0 if the test is false.
    Donc m c'est la valeur de myStruct.st_mode
    Mais je ne comprend pas, il serait plutôt logique de demander comme paramètre le chemin du fichier/dossier ?!
    Apparement (d'après ce que j'ai lu) m c'est le mode du fichier :
    mode_t st_mode Mode of file (see below).
    Voilà le 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <errno.h>
    #include "myHeader.h"
    int lister(char *directory);
    int main(int argc, char **argv)
    {
        struct stat infos;
        char directory[256];
     
       fgets(directory, sizeof directory, stdin);
       fclean(directory, stdin);
     
       stat(directory, &infos);
     
       if(S_ISDIR(infos.st_mode))
       {
                                printf("files");
       }
       else
       {
           printf("folder");
       }
     
       fprintf(stdout, "\n");
       system("PAUSE");
       return 0;
    }

  7. #47
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Bon j'ai trouvé la phrase :
    Bien. Effectivement, tout est là.
    Donc m c'est la valeur de myStruct.st_mode
    Oui.
    Mais je ne comprend pas, il serait plutôt logique de demander comme paramètre le chemin du fichier/dossier ?!
    Gné ? La vrai question est de savoir comment myStruct.st_mode a été initialisée.
    Voilà le code :
    Ce qu'il y a dans les branches de test est toujours aussi faux...
    Correction :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <sys/stat.h>
     
    /* made from 100% recycled bits */
    void fclean (char *s_buffer, FILE * stream)
    {
       if (s_buffer != NULL && stream != NULL)
       {
          char *pc = strchr (s_buffer, '\n');
     
          if (pc != NULL)           /* La saisie n'a pas ete tronquee */
          {
             /* On remplace '\n' par le caractere nul '\0' */
             *pc = 0;
          }
          else
          {
             /* La saisie a ete tronquee, on purge le flux d'entree */
             int c;
             while ((c = fgetc (stream)) != '\n' && c != EOF)
             {
             }
          }
       }
    }
     
     
    int main (void)
    {
       int end;
       do
       {
          char directory[256];
          printf ("nom (ou <enter> pour quitter) : ");
          fgets (directory, sizeof directory, stdin);
          fclean (directory, stdin);
          end = *directory == 0;
          if (!end)
          {
             struct stat infos;
             stat (directory, &infos);
     
             if (S_ISDIR (infos.st_mode))
             {
                printf ("'%s' is a folder\n", directory);
             }
             else
             {
                printf ("'%s' is a file\n", directory);
             }
          }
       }
       while (!end);
       return 0;
    }
    Pose des questions si tu ne comprends pas.

    (et je rappelle : UN problème par code de test ou snippet...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nom (ou <enter> pour quitter) : main.c
    'main.c' is a file
    nom (ou <enter> pour quitter) : ..
    '..' is a folder
    nom (ou <enter> pour quitter) : .
    '.' is a folder
    nom (ou <enter> pour quitter) : \
    '\' is a folder
    nom (ou <enter> pour quitter) : \autoexec.bat
    '\autoexec.bat' is a file
    nom (ou <enter> pour quitter) :
     
    Press ENTER to continue.

  8. #48
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci (votre code ne donne aucun résultat mais je vais essayer de comprendre pourquoi) :

    Je ne comprend un truc. Si l'on fait char directory[256], *directory n'a aucune adresse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    end = *directory == 0;
    Pouve-vous m'expliquer cette ligne ?

    Sinon lorsque je rentre :

    C:\Users\SamSoft\Documents\Programmation\doc\C\array\arrays.mht

    Il me met : folder

  9. #49
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    La ligne que tu comprends mal est plus explicite ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    end = (directory[0] == '\0');
    En clair, la variable end devient non-nulle si le premier caractère de la chaîne est nul (donc, si la chaîne est vide).
    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.

  10. #50
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Ah ok Mais il reste un problème : le fait d'écrire : c:\monFichier.txt me sort folder

  11. #51
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Merci (votre code ne donne aucun résultat mais je vais essayer de comprendre pourquoi) :
    Aucun résultat ? C'est à dire ?
    Je ne comprend un truc. Si l'on fait char directory[256], *directory n'a aucune adresse ?
    Euh, tu apprends le C dans le désordre ? Ce genre de question basique devrait être réglée avant de s'attaquer aux répertoires...

    Un tableau de char a une adresse qui est celle du premier élément de ce tableau. Il se trouve que lorsqu'on passe un tableau à une fonction, celui-ci est automatiquement converti en une adresse ... qui est celle du premier élément du tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    end = *directory == 0;
    Pouve-vous m'expliquer cette ligne ?
    *directory est la même chose que directory[0]. Ca désigne la valeur du prelier élément du tableau.
    Si cette valeur est 0 (ou '\0'), c'est qu'on a rien saisi. (chaine 'vide').
    L'expression *directory == 0 est donc vérifiée, elle vaut donc 1.
    donc end vaut 1.
    Sinon lorsque je rentre :

    C:\Users\SamSoft\Documents\Programmation\doc\C\array\arrays.mht

    Il me met : folder
    Alors c'est que tu n'utilises pas mon code...

    Tu as fait les tests avec des répertoires et fichiers dont tu es sûr de l'existence, comme je l'ai fait ?

    En fait, il y'a préalable qui n'est pas testé ici, c'est que le fichier (ou le répertoire) existe...

    Lire la doc de stat(), mais il faut probablement tester le retour avant d'agir...

    Une fois la correction faite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    nom (ou <enter> pour quitter) : xxx
    'xxx' is unknown
    nom (ou <enter> pour quitter) : ..
    '..' is a folder
    nom (ou <enter> pour quitter) : main.c
    'main.c' is a file
    nom (ou <enter> pour quitter) :
     
    Press ENTER to continue.

  12. #52
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    *directory est la même chose que directory[0]. Ca désigne la valeur du prelier élément du tableau.
    Si cette valeur est 0 (ou '\0'), c'est qu'on a rien saisi. (chaine 'vide').
    L'expression *directory == 0 est donc vérifiée, elle vaut donc 1.
    donc end vaut 1.
    Médinoc me l'a expliqué mais je ne le savais pas avant

    Sinon, oui le fichier existe, si je met main.c ca marche mais un chemin style c:\monFichier ne marche pas (il me met folder) alors que le chemin est tout à fait correct (le fichier existe).

  13. #53
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Sinon, oui le fichier existe, si je met main.c ca marche mais un chemin style c:\monFichier ne marche pas (il me met folder) alors que le chemin est tout à fait correct (le fichier existe).
    Mon code est correct. La dernière version avec test du fichier :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <sys/stat.h>
     
    /* made from 100% recycled bits */
    void fclean (char *s_buffer, FILE * stream)
    {
       if (s_buffer != NULL && stream != NULL)
       {
          char *pc = strchr (s_buffer, '\n');
     
          if (pc != NULL)           /* La saisie n'a pas ete tronquee */
          {
             /* On remplace '\n' par le caractere nul '\0' */
             *pc = 0;
          }
          else
          {
             /* La saisie a ete tronquee, on purge le flux d'entree */
             int c;
             while ((c = fgetc (stream)) != '\n' && c != EOF)
             {
             }
          }
       }
    }
     
    int main (void)
    {
       int end;
       do
       {
          char directory[256];
          printf ("nom (ou <enter> pour quitter) : ");
          fgets (directory, sizeof directory, stdin);
          fclean (directory, stdin);
          end = *directory == 0;
          if (!end)
          {
             struct stat infos;
             int err = stat (directory, &infos);
             if (!err)
             {
                if (S_ISDIR (infos.st_mode))
                {
                   printf ("'%s' is a folder\n", directory);
                }
                else
                {
                   printf ("'%s' is a file\n", directory);
                }
             }
             else
             {
                printf ("'%s' is unknown\n", directory);
             }
          }
       }
       while (!end);
       return 0;
    }
    Essaye le tel quel sans changer un iota.

  14. #54
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    J'avais du faire une mauvaise manipulation, ca fonctionne parfaitement. Je vais essayer de dresser une liste de fichiers si c'est un répertoire

    Merci Emmanuel (je ne poste pas encore résolu)

  15. #55
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    J'avais du faire une mauvaise manipulation,
    C'est pas la première fois, alors STP, prends le temps nécessaire pour réaliser tes essais avant de dire que le code des autres ne fonctionne pas...

  16. #56
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Bon alors voilà j'ai pris le code que l'on trouve sur le site et je l'ai couplé avec celui que j'ai déjà. Ca donne ceci :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <errno.h>
    #include <sys/stat.h>
    #include "myHeader.h"
    int lister(char *directory);
     
    int main (void)
    {
       int end;
       do
       {
          char directory[256];
          printf ("nom ou <enter> pour quitter) : ");
          fgets (directory, sizeof directory, stdin);
          fclean (directory, stdin);
          end = (directory[0] == '\0');
          if (!end)
          {
     
             lister(directory);
          }
       }
       while (!end);
       return 0;
    }
    int lister(char *directory)
    {
       DIR *dir = NULL;
       struct dirent *file = NULL;
       struct stat infos;
       stat (directory, &infos);
     
       if((dir = opendir(directory)) == NULL)
       {
          return EXIT_FAILURE;
       }
       printf("Repertoire %s :\n", directory);
     
       while((file = readdir(dir)) != NULL)
       {
          if(strcmp(file->d_name, ".") && strcmp(file->d_name, ".."))
          {
             if(S_ISDIR (infos.st_mode))
             {
                lister(strncat(directory, file->d_name, 256));
             }
             else
             {
                printf("\t%s\n", file->d_name);
             }
          }
       }
     
       printf("Fin repertoire %s\n", directory);
     
       closedir(dir);
     
       return EXIT_SUCCESS;
    }
    Bon, ca compile (avec les paramètres que propose Emmanuel sur son site)
    Si je met :

    C:\

    Il me met :

    nom ou <enter> pour quitter) : c:\
    Repertoire c:\ :
    Repertoire c:\$Recycle.Bin :
    Fin repertoire c:\$Recycle.BinS-1-5-21-1977114147-3677329669-3575530183-500S-1-5
    -21-2152478756-3922319563-605102323-500S-1-5-21-2256296683-2490543695-1737019047
    -500S-1-5-21-3292954902-2297236452-2890570197-1000S-1-5-21-3950889498-3502377534
    -3191853766-500
    Je pense que c'est parce que je mélange dirent et stat peut être que je ne devrais utiliser que stat ?

    Merci d'avance

  17. #57
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Bon alors voilà j'ai pris le code que l'on trouve sur le site et je l'ai couplé avec celui que j'ai déjà. Ca donne ceci :
    <...>
    Bon, ca compile<...> Je pense que c'est parce que je mélange dirent et stat peut être que je ne devrais utiliser que stat ?
    C'est surtout que comme d'habitude, tu veux aller trop vite. Ce que tu veux tester, c'est si chaque entrée lue est un répertoire ou non.

    Alors commence par appliquer stat() à la bonne valeur, c'est à dire aux entrées lues ! Simple bon sens.

    Mets une trace pour vérifier la tronche de ce que fabrique avec strncat().

    Enfin, se lancer dans récursivité quand on débute n'est pas forcément une bonne idée. Lister des répertoire imbriqués est une opérations assez délicate qui peu se terminer en crash assez rapidement... La méthode de l'accumulation des noms (surtout si il manque le séparateur, hum...) n'est pas forcément la meilleure. Un changement de répertoire est souvent suffisant. (chdir() avec ".." pour remonter).

    Enfin, ne commence pas par tester la racine de ton disque, parce que c'est ce qu'il y a de plus long... Contente toi de 2 ou 3 répertoires imbriqués... (le répertoire courant de Code::Blocks est largement suffisant pour le test).

  18. #58
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci

    J'avance

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <errno.h>
    #include <sys/stat.h>
    #include "myHeader.h"
    int lister(char *directory);
     
    int main (void)
    {
       int end;
       do
       {
          char directory[256];
          printf ("nom ou <enter> pour quitter) : ");
          fgets (directory, sizeof directory, stdin);
          fclean (directory, stdin);
          end = (directory[0] == '\0');
          if (!end)
          {
     
             lister(directory);
          }
       }
       while (!end);
       return 0;
    }
    int lister(char *directory)
    {
       DIR *dir = NULL;
       struct dirent *file = NULL;
       struct stat infos;
       stat (directory, &infos);
     
       if((dir = opendir(directory)) == NULL)
       {
          return EXIT_FAILURE;
       }
       printf("Repertoire %s :\n", directory);
     
       while((file = readdir(dir)) != NULL)
       {
          if(strcmp(file->d_name, ".") && strcmp(file->d_name, ".."))
          {
             if(S_ISDIR (infos.st_mode))
             {
                stat (file->d_name, &infos);
                lister(strncat(directory, file->d_name, 256));
             }
             else
             {
                printf("\n\t%s\n", file->d_name);
             }
          }
       }
     
       printf("\nFin repertoire %s\n", directory);
     
       closedir(dir);
     
       return EXIT_SUCCESS;
    }
    Si je tape c:\Dev-Cpp il me met :

    nom ou <enter> pour quitter) : c:\Dev-Cpp
    Repertoire c:\Dev-Cpp :
    main.o
    Makefile.win
    mingw32
    NEWS.txt
    Packages
    Packman.exe
    Packman.map
    Projet1.dev
    Projet1.exe
    Projet1.layout
    Templates
    uninstall.exe
    Fin repertoire c:\Dev-CppbinclearScreen.hcopying.txtdevcpp.exedevcpp.mapExamples
    HelpIconsIcons.rarincludeLangliblibexecmain.c
    nom ou <enter> pour quitter) :
    La fin est un peu étrange, ca doit venir d'une mauvaise assignation de valeur mais je ne vois pas où

    Sinon c'est bon (enfin je crois)

  19. #59
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Si je tape c:\Dev-Cpp il me met :

    La fin est un peu étrange, ca doit venir d'une mauvaise assignation de valeur mais je ne vois pas où

    Sinon c'est bon (enfin je crois)
    C'est mieux. Maintenant, il faut contrôler (visualiser) ce que fait strncat(). D'ailleurs, tu l'utilises mal. C'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       strncat (dest, src, size - strlen (dest) - 1);
    (il manque donc un paramètre size quelque part...)

    Mais ça ne fait que masquer silencieusement le problème de débordement sans le signaler. Il vaudrait mieux anticiper et n'utiliser strcat() que quand c'est possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       if (strlen (src) + strlen (dest) + 1 < size)
       {
          strcat (dest, src);
       }
       else
      {
          /* prendre des mesures... */
      }
    Mais comme je te l'ai dit, le mécanisme à accumulation, c'est bien joli, mais ça ne résout pas le problème, (même avec les bons séparateurs). Comment tu remontes ? N'oublie pas qu'un système de fichiers est une arborescence...

    Il y a peut être aussi un problème d'ordre d'exécution... (Enfin, je ne sais pas ce que tu veux faire exactement...)

  20. #60
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci Emmanuel.

    Je suis allé sur : http://www710.univ-lyon1.fr/~jciehl/...strncat.3.html et j'ai compris ce qu'il manquait. Mais je n'ai pas compris quelque chose, size c'est la taille de quoi ?

    Et aussi : "prendre de mes mesures", lesquelles ?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/05/2010, 13h56
  2. [Programmation]Faire du COM/OLE sous Linux ou équivalence
    Par randriano dans le forum Applications et environnements graphiques
    Réponses: 13
    Dernier message: 12/06/2008, 08h51
  3. Réponses: 3
    Dernier message: 14/08/2006, 22h08
  4. [EDI] Outil de programmation PHP équivalent à VSS
    Par bourvil dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 23/02/2006, 16h18

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