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 :

parcours arboresence : fichier ou dossier?


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Par défaut parcours arboresence : fichier ou dossier?
    bonjour,
    je parcours une arborescence de fichiers et je mets le fichier ou le dossier courant dans une struct dirent, comment savoir si le dirent courant est un fichier ou un dossier ?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Voir stat et la macro S_ISDIR ou S_ISREG
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Par défaut
    le dirent est généré par l'appel de la fonction readdir(DIR ). Dans cette structure, il y a : ino_t d_ino, off_t d_off, unsigned short d_reclen, char d_name[1]. Qu'est-ce que sont les d_ino,d_off et d_reclen ? car j'ai vu que les dossiers avaient un d_reclen = 16 et les fichiers txt = 28, y aurait-il un lien entre d-reclen et type de fichier ?

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Issu du fichier dirent.h
    `d_reclen' member that gives the size of the entire directory entry.
    Tu n'as pas le choix, il faut utiliser les fonctions et macros du fichier stat.h, c'est fait pour ça.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Par défaut
    j'essaie d'utiliser stat() mais j'ai qq prob, notamment pour me servir de S_ISREG et S_ISDIR. Je me positionne sur un fichier, je lui applique stat() avec en param d_name d'1 dirent et 1 stat. C'est là que je ne sais pas comment on se sert de S_ISREG par exemple.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par crischprolch
    j'essaie d'utiliser stat() mais j'ai qq prob, notamment pour me servir de S_ISREG et S_ISDIR. Je me positionne sur un fichier, je lui applique stat() avec en param d_name d'1 dirent et 1 stat. C'est là que je ne sais pas comment on se sert de S_ISREG par exemple.
    Tu dois passer le champs st_mode de la structure stat en argument de la macro.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    struct stat status;
    ...
    if (S_ISDIR (status.st_mode) ...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Par défaut
    merci je v essayer

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Par défaut
    j'ai écrit :

    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
    main(){
       struct dirent *lecture;
       DIR *rep;
       rep = opendir(argv[1]);
       struct stat sb;
     
       lecture = readdir(rep);
       lecture = readdir(rep);
       while ((lecture = readdir(rep)))
       {
          char *s=lecture->d_name;
          printf("> %s\n", s);
          stat(lecture->d_name, &sb);
          if(S_ISDIR(sb.st_mode)) {
          printf("c un rep\n");
          }
          if (S_ISREG(sb.st_mode)){
          printf("c un fichier\n");
          }
       }
       closedir(rep);
    }
    et ça ne m'affiche rien...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Par défaut
    enfin si, ça m'affiche les fichiers et dossiers contenus dans le repertoire passé en param mais je voulais aussi qu'il dise pour chaque si c un fichier ou un dossier...

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Il faudrait que tu utilises correctement la balise CODE la prochaine fois


    Bon, voici ton code remanié (un peu):
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <dirent.h>
    #include <sys/stat.h>
     
     
    int main (int argc, char ** argv)
    {
       struct dirent * lecture = NULL;
       DIR *rep = NULL;
       struct stat sb;
       int ret = 0;
     
     
       if (argc > 1)
       {
          rep = opendir(argv[1]);
     
          if (rep != NULL)
          {
             while ((lecture = readdir(rep)) != NULL)
             {
                printf("> %s\n", lecture->d_name);
     
                ret = stat(lecture->d_name, &sb);  
                if (ret == 0)
                {
                   if(S_ISDIR(sb.st_mode)) {
                      printf("c un rep\n");
                   }
                   if (S_ISREG(sb.st_mode)){
                      printf("c un fichier\n");
                   }
                }
             }
          }
       }
     
     
       if (rep != NULL)
       {
          closedir(rep);
       }
     
     
       return EXIT_SUCCESS;
    }
    Et la sortie qui va bien:
    franhec@franhec-ubuntu:~/Documents$ ./test /home/franhec/Documents/
    > .
    c un rep
    > ..
    c un rep
    > Programmation
    c un rep
    > Mes Images
    c un rep
    > Téléchargements
    c un rep
    > CNAM
    c un rep
    > Test.class
    c un fichier
    > main.c
    c un fichier
    > test
    c un fichier
    > Test.java
    c un fichier
    C'est bien ce que tu attendais ?


    Quelques remarques en passant:

    Les prototypes pour le main sont:
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main (int argc, char ** argv)
    main retourne toujours un entier donc il faut mettre un return à la fin du main.

    Ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *s=lecture->d_name;
    c'est inutile, tu passe directement lecture->d_name en argument comme pour l'affichage du nom dans ton printf.

    Ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lecture = readdir(rep);
    lecture = readdir(rep);
    c'est inutile si tu le fait déjà dans la boucle.

    Il ne faut jamais oublier de tester le retour des fonctions comme stat par exemple, ce que tu ne fait pas.


    Voilà, c'est à peu près tout, du moins les principales choses


    EDIT J'ai mis le code à jour, j'avais oublié quelque chose
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Par défaut
    merci beaucoup

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par crischprolch
    merci beaucoup
    Au plaisir ! Si tu comprend pas un truc hésite pas.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    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 crischprolch
    j'ai écrit :
    <...>
    et ça ne m'affiche rien...
    Heureusement !
    Project : Forums
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:1: warning: return type defaults to `int'
    main.c: In function `main':
    main.c:3: error: `DIR' undeclared (first use in this function)
    main.c:3: error: (Each undeclared identifier is reported only once
    main.c:3: error: for each function it appears in.)
    main.c:3: error: `rep' undeclared (first use in this function)
    main.c:4: warning: implicit declaration of function `opendir'
    main.c:4: error: `argv' undeclared (first use in this function)
    main.c:5: error: storage size of 'sb' isn't known
    main.c:7: warning: implicit declaration of function `readdir'
    main.c:7: warning: assignment makes pointer from integer without a cast
    main.c:8: warning: assignment makes pointer from integer without a cast
    main.c:9: warning: assignment makes pointer from integer without a cast
    main.c:11: error: dereferencing pointer to incomplete type
    main.c:12: warning: implicit declaration of function `printf'
    main.c:13: warning: implicit declaration of function `stat'
    main.c:13: error: dereferencing pointer to incomplete type
    main.c:14: warning: implicit declaration of function `S_ISDIR'
    main.c:17: warning: implicit declaration of function `S_ISREG'
    main.c:21: warning: implicit declaration of function `closedir'
    main.c:5: warning: unused variable `sb'
    main.c:22:2: warning: no newline at end of file
    Process terminated with status 1 (0 minutes, 3 seconds)
    8 errors, 13 warnings
    Merci de poster du code testable

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

Discussions similaires

  1. Parcours des fichiers d'un dossier
    Par VB 2008 dans le forum VB.NET
    Réponses: 1
    Dernier message: 16/07/2008, 01h33
  2. [VBA-E] parcours de fichiers et de dossiers
    Par trach.sam dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/08/2006, 17h34
  3. [VBA-A]Parcours d'une arborescence dossiers et fichiers
    Par sidneyvba dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/03/2006, 16h58
  4. Fichiers ou dossier...
    Par Franck.H dans le forum C
    Réponses: 9
    Dernier message: 15/03/2004, 20h23
  5. [LG]Lenteur de parcours de fichier
    Par YéTeeh dans le forum Langage
    Réponses: 9
    Dernier message: 26/11/2003, 22h57

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