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 :

[readdir] Lister les fichiers d'un dossier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut [readdir] Lister les fichiers d'un dossier
    Bien le bonjour à vous !

    J'ai un petit soucis pour lister le contenu d'un dossier contenant deux images, voici 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
    #include <stdio.h>
    #include <dirent.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define EXT ".jpg"
    #define PATH "/home/flaherty/Documents/convertisseur/images/"
     
    int main(void)
    {
       DIR *dir = opendir (PATH); 
     
       struct dirent *dp;
       int filecount = 0;
     
       if (dir == NULL)
        {
            printf("pas de dossier");
        }
     
       while ((dp = readdir (dir)) != NULL) //tant qu'il y'a des fichiers non lu dans le dossier
        {
            filecount++;
            printf("%s\n", dp->d_name);
        }
     
        printf("\nil y a %d trucs dans ce putain de dossier\n\n",filecount);
     
        return 0;
    }
    et voici ce que j'obtiens dans ma console :

    .
    image1.raw
    ..
    image2.jpg

    il y a 4 trucs dans ce putain de dossier
    Et maintenant ma super question : pourquoi dans la structure créer par readdir, on a ces entrées faites de points qui fausse le comptage du nombre d'objets contenu par le dossier ? Et comment les virer ?

    Ah et pendant que j'y suis je vais vous poser une petite question théorique, en fait ce que je veux faire c'est ouvrir toutes les images jpg du dossier, pour cela une fois le contenu du dossier listé, je compte chercher le caractère "." avec strchr et comparer ce qui suit avec mon extension ".jpg" en utilisant strcmp pour savoir quels sont les fichier à ouvrir. C'est une bonne méthode ?

    Merci beaucoup

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Ta méthode pour chercher l'extension .jpg me semble bonne si tu ne comptes pas utiliser de librairie de plus haut niveau comme la glib.

    Le "fichier" '.' correspond au dossier courant, et '..' au dossier parent.

    Quoi qu'il en soit, un dossier contiendra toujours . et ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    toto/
      |-- .
      `-- ..

  3. #3
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 104
    Par défaut
    Pour récupérer seulement les fichiers, utilise l'attribut d_type de la structure dirent qui ont une des valeurs suivantes:

    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
    DT_UNKNOWN
        The type is unknown. On some systems this is the only value returned.
     
    DT_REG
        A regular file.
     
    DT_DIR
        A directory.
     
    DT_FIFO
        A named pipe, or FIFO. See section 15.3 FIFO Special Files.
     
    DT_SOCK
        A local-domain socket.
     
    DT_CHR
        A character device.
     
    DT_BLK
        A block device.

  4. #4
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Ok merci ! Mais en fait j'ai réfléchi après, ça ne pose aucun problème pour ce que je veux faire.

    Par contre j'ai une autre question maintenant. J'aimerais comme vous vous en douter stocker le nom des fichiers dans un tableau. Vu que mes noms de fichiers n'ont pas un nombre de caractères constant, il faut que je fasse un tableau de pointeurs sur des tableaux de char (ces derniers étant ceux vers lesquelles pointent d_name de la structure dirent).

    Le problème c'est que je suis carrément débutant en c, et je suis un peu perdu avec ces histoires de pointeurs.

    Si j'ai bien compris la théorie, il faudrait que je fasse une allocation dynamique de mémoire à un tableau qui serait fonction de la taille de filecount (pour avoir un tableau avec autant de cases qu'il y'a d'objets dans mon répertoire) en utilisant malloc et sizeof, puis que je copie l'adresse de la chaine de caractères vers laquelle pointe d_name, dans la ième case de mon tableau à l'aide de strcpy.

    Le truc c'est que je sais pas trop comment mettre ça en place d'un point de vue syntaxique. Si vous aviez des petites idées pour me mettre sur la voie ce serait sympa !

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    que je copie l'adresse de la chaine de caractères ... à l'aide de strcpy
    strcpy() ne copie pas l'adresse de la chaine, mais la chaine elle-même. Ceci étant, il te faut effectivement copier la chaine.

    On peut suivre le schéma suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    - Allouer un tableau de filecount pointeurs sur char :
      char** Fichiers = malloc(filecount* sizeof(char*));
    
    Si l'allocation a réussi :
    
    - Pour chaque entrée dans le répertoire :
      - Allouer le nombre de caractères du nom à stocker+1 :
        Fichiers[i]= malloc(strlen(dp->d_name)+1);
    
      - si l'allocation a réussi, copier la chaine :
        strcpy(Fichiers[i],dp->d_name);
    
    - En cas d'échec d'une allocation, arrêter le processus et détruire tout ce qui a été alloué par malloc (free())

  6. #6
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    okidoki merci ça m'aide bien !

    Juste deux petite choses encore :

    Pour vérifier que l'allocation est vérifié il suffit de faire ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       char **Fichiers=malloc(filecount* sizeof(char*));
     
       if(Fichiers==NULL)
          {
          free(Fichiers);
          printf("erreur lors de l'allocation memoire");
          }
       else
          {   
     ...
          }
    et deuxième point, au vu de ce qui s'affiche avec ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       while ((dp = readdir (dir)) != NULL) 
        {
            filecount++;
            printf("%s\n", dp->d_name);
        }
    J'ai cru comprendre que dp est réinitialisé à chaque 'tour' de la boucle while, et dp->d_name pointe vers le dernier fichier checké. Donc si on veut copier à chaque fois la chaine dans Fichiers, il faut utiliser strcpy dans la boucler while ? Problème, si on le fait dans la boucle while, on ne peut pas connaitre le nombre de fichiers avant et donc allouer la mémoire en conséquence. Il faut faire deux boucles while ?

    Désolé, de vous embêter mais j'essaye de bien comprendre comment ça marche !

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

Discussions similaires

  1. Lister les fichiers d'un dossier
    Par Mom's dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/11/2006, 09h32
  2. [PC] Lister les fichiers d'un dossier
    Par toto_in_th_sky dans le forum Cobol
    Réponses: 2
    Dernier message: 11/09/2006, 18h44
  3. Réponses: 13
    Dernier message: 24/08/2006, 14h05
  4. Lister les fichiers d'un dossier par page
    Par bwatex dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 17/08/2006, 20h09
  5. Réponses: 2
    Dernier message: 24/05/2006, 20h29

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