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 :

Lister sous-dossiers d'un dossier défini


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Lister sous-dossiers d'un dossier défini
    Oui j'ai lu les 2 posts retournés par ma recherche et la FAQ sur les fichiers, mais j'ai encore quelques questions.

    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
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
     
    int main(void)
    {
       struct dirent *lecture;
       DIR *rep;
       rep = opendir("/tmp");
       while ((lecture = readdir(rep)))
       {
          printf("FICHIER: %s\n", lecture->d_name);
       }
       closedir(rep);
     
       return 0;
    }
    -Est-ce que même les sous-dossiers sont affichés dans cette boucle? Si oui, je pourrais utiliser un opendir() sur les éléments du while pour ne conserver que les sous-dossiers (mon objectif).

    -L'application que je développe est multi-plateformes et j'aimerais autant que possible n'utiliser qu'une seule fonction pour parvenir à mon objectif, est-ce que la méthode POSIX fonctionne sur Windows aussi? Je l'ai essayé mais on me donne l'erreur: fatal error C1083: Cannot open include file: 'dirent.h': No such file or directory

    J'imagine que le header file est tout simplement manquant (comment l'ajouter et où l'obtenir?) ou bien que cette méthode n'est pas compatible avec Windows (dans ce cas, y aurait-il une autre méthode multi-plateformes?)

    Merci beaucoup 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
    Par défaut
    Dirent n'est pas directement supporté par Windows.

    MinGW l'ajoute en tant qu'extension, donc ça marcherait en compilant sous MinGW.

    Sinon, tu peux utiliser soit les fonctions de l'API Win32 (voir FindFirstFile()), soit en C++, les fonctions portables de boost.filesystem.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci, et pour ma première question?

  4. #4
    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
    Par défaut
    je crois bien que oui, les sous-dossiers aussi sont affichés (mais pas leur contenu)
    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.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ok.

    Je viens de trouver cela: http://www.gimp.org/~tml/gimp/win32/dirent.zip, comment l'intégrer à mon projet Visual Studio?

    Edit: J'ai placé les fichiers dans les dossiers de Vc7, maintenant j'ai ça lorsque je veux compiler.

    main.c(32) : error C2143: syntax error : missing ';' before 'type'
    main.c(33) : error C2275: 'DIR' : illegal use of this type as an expression
    C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\dirent.h(74) : see declaration of 'DIR'
    main.c(33) : error C2065: 'rep' : undeclared identifier
    main.c(34) : warning C4047: '=' : 'int' differs in levels of indirection from 'DIR *'
    main.c(35) : error C2065: 'lecture' : undeclared identifier
    main.c(35) : warning C4047: 'function' : 'DIR *' differs in levels of indirection from 'int'
    main.c(35) : warning C4047: '=' : 'int' differs in levels of indirection from 'dirent *'
    main.c(37) : error C2223: left of '->d_name' must point to struct/union
    main.c(39) : warning C4047: 'function' : 'DIR *' differs in levels of indirection from 'int'

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    J'ai changé l'ordre des includes et maintenant j'ai seulement ça:

    main.obj : error LNK2019: unresolved external symbol _closedir referenced in function _main
    main.obj : error LNK2019: unresolved external symbol _readdir referenced in function _main
    main.obj : error LNK2019: unresolved external symbol _opendir referenced in function _main
    Debug/Phraz0thon - TEXT.exe : fatal error LNK1120: 3 unresolved externals
    Je dois être près du but?

    Edit:

    J'ai ajouté dirent.lib dans les dépendances du linker, nouveau résultat:

    MSVCRT.lib(MSVCR71.dll) : error LNK2005: _malloc already defined in LIBCD.lib(dbgheap.obj)
    MSVCRT.lib(MSVCR71.dll) : error LNK2005: _free already defined in LIBCD.lib(dbgheap.obj)
    LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
    Debug/Phraz0thon - TEXT.exe : fatal error LNK1169: one or more multiply defined symbols found

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par mathieumg
    Edit:

    J'ai ajouté dirent.lib dans les dépendances du linker, nouveau résultat:
    MSVCRT.lib(MSVCR71.dll) : error LNK2005: _malloc already defined in LIBCD.lib(dbgheap.obj)
    MSVCRT.lib(MSVCR71.dll) : error LNK2005: _free already defined in LIBCD.lib(dbgheap.obj)
    LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
    Debug/Phraz0thon - TEXT.exe : fatal error LNK1169: one or more multiply defined symbols found
    Comme le dit le message d'erreur, c'est un conflit de libs. Tu peux essayer de désactiver certaines libs linkées par défaut pour voir (genre libcd et/ou libc). Mais rien ne dit que le problème soit soluble, peut-être est-ce la lib ajoutée qui n'est pas compatible...
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par mathieumg
    -Est-ce que même les sous-dossiers sont affichés dans cette boucle? Si oui, je pourrais utiliser un opendir() sur les éléments du while pour ne conserver que les sous-dossiers (mon objectif).
    Bon après plusieurs essais, je me suis dirigé vers MinGW, et là ça fonctionne.

    Oui la fonction affiche également les sous-dossiers, mais mon idée avec opendir() ne semble pas vraiment fonctionner, quelqu'un a une idée?

    Edit: En fait ça fonctionne seulement pour le dossier actuel, pour une raison bien évidente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dir_p = opendir(".");
    if( opendir(dir_entry_p->d_name) != NULL )
    fonctionne, mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dir_p = opendir("./subdir");
    if( opendir(dir_entry_p->d_name) != NULL )
    ne fonctionne pas puisqu'on essaie de vérifier si un sous-sous-dossier est présent dans le dossier actuel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dir_p = opendir("./subdir");
    if( opendir("./subir/" . dir_entry_p->d_name) != NULL )
    Il faudrait alors ajouter le chemin pour aller au même niveau, mais ce bout de code renvoit l'erreur "request for member `dir_entry_p' in something not a structure or union", et je n'ai aucune idée pourquoi. Merci de votre aide.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par mathieumg
    Bon après plusieurs essais, je me suis dirigé vers MinGW, et là ça fonctionne.
    Bien.

    Citation Envoyé par mathieumg
    Oui la fonction affiche également les sous-dossiers, mais mon idée avec opendir() ne semble pas vraiment fonctionner, quelqu'un a une idée?
    Je ne suis pas certain d'avoir suivi ton "idée avec opendir()" donc je m'abstiendrai sur cette question.

    Citation Envoyé par mathieumg
    Edit: En fait ça fonctionne seulement pour le dossier actuel, pour une raison bien évidente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dir_p = opendir(".");
    if( opendir(dir_entry_p->d_name) != NULL )
    fonctionne, mais
    Moi, ça m'étonne que cela fonctionne pour une raison bien évidente : d'après le bout de code que tu nous mets, tu récupères la valeur de retour d'une fonction dans une variable puis tu utilises une autre variable qui ne semble pas, toujours d'après le code que tu nous présentes, avoir été initialisée... Soit il y a un problème dans ton code, soit tu as omis de nous présenter des choses utiles, soit je ne comprends rien à rien. Au choix...

    Citation Envoyé par mathieumg
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dir_p = opendir("./subdir");
    if( opendir(dir_entry_p->d_name) != NULL )
    ne fonctionne pas puisqu'on essaie de vérifier si un sous-sous-dossier est présent dans le dossier actuel.
    Je ne vois pas le lien de cause à effet (cf. "puisqu")... En théorie c'est possible de faire un ' opendir("./subdir") ', voire même un ' opendir(".subdir/subdir/subdir") ' si tu veux... La vérité serait-elle ailleurs ?

    Citation Envoyé par mathieumg
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dir_p = opendir("./subdir");
    if( opendir("./subir/" . dir_entry_p->d_name) != NULL )
    Il faudrait alors ajouter le chemin pour aller au même niveau, mais ce bout de code renvoit l'erreur "request for member `dir_entry_p' in something not a structure or union", et je n'ai aucune idée pourquoi. Merci de votre aide.
    Ah... Là je crois pouvoir t'aider : tu t'es trompé de forum. Si tu veux concaténer des chaînes de caractères avec un point ("."), il faut faire ça en PHP. Si tu veux le faire en C, il te faudra utiliser une fonction comme strncat() (voire strlcat() si tu peux sacrifier un poil de portabilité, si ton système le supporte, si tu veux, etc).

    Bon, si j'ai bien compris tu veux afficher la liste des sous-dossiers d'un dossier et leurs sous-dossiers respectifs et leurs sous-dossiers respectifs et leurs... c'est ça ?
    Si oui (sans gestion d'erreurs, sans déclarations de variables et pas en C pour que tu bosses quand même 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
    fonction afficherSousDossiersDe(nomDossierDepart)
        ouvrir dossier nomDossierDepart
        tant que ( lire élément de dossier ouvert) renvoie quelque-chose
            si élément de dossier ouvert est un dossier
                afficher son nom
                affecter la concaténation de ( nomDossierDepart avec "/" et nom de élément courant) à nomSousDossier
                afficherSousDossiersDe(nomSousDossier)
            fin si
        fin tant que
        fermer dossier ouvert
    fin fonction
     
    fonction principale(nomDossierDepartChoisiParLUtilisateur)
        afficherSousDossiersDe(nomDossierDepartChoisiParLUtilisateur)
    fin fonction
    Tu noteras que la fonction afficherSousDossiersDe() s'appelle elle-même : elle est récursive...un peu come la structure des dossiers et sous-dossiers (un dossier peut contenir des dossiers qui peuvent contenir des dossiers qui peuvent contenir des dossiers...).
    On peut faire la même chose sans récursivité mais là ça t'évite d'avoir à manipuler une liste ou un tableau dynamique (restons simples).

    Ca t'aide ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci de la réponse

    Dans la FAQ de développez, il est écrit que "opendir()" peut être utilisé pour savoir si le paramètre est un dossier (retourne NULL s'il en est pas un).

    Alors avec le code pour afficher tous les éléments d'un dossier (fichiers et sous-dossiers) et le opendir(), je veux afficher seulement les sous-dossier d'un dossier et je n'ai pas besoin que ce soit récursif (donc un simple while() devrait suffire théoriquement).

    Il manque en effet une partie du code, j'ai décidé d'afficher que les parties qui changeaient pour ne pas être répétitif, j'aurais peut-être dû les mettre en pseudo-code, désolé.

    Merci pour la concaténation, en fait je suis avancé en PHP et ce sont mes débuts dans le C et puisque ce thème n'a pas encore été abordé dans mon cours et que je sais que le PHP a été inspiré du C, j'ai tenté ma chance (avec tort :p).

    Par "un poil de portabilité" qu'entends-tu? En gros, avec quels systèmes ce ne serait plus compatible?

    Merci pour l'aide, je vais aller essayer strncat().

  11. #11
    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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Moi j'aurais simplement préconisé stat (qui est également POSIX) dans la boucle, stat qui permet d'avoir toutes les infos sur un fichier (donc aussi des dossiers) dont son type (fichier régulier, dossier, link, hard link, etc..) ... !
    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 !

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

Discussions similaires

  1. lister les sous-dossiers d'un dossier
    Par zizzo dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/07/2012, 13h40
  2. lister le contenus d'un dossier existant sous D:\
    Par modafine dans le forum C++
    Réponses: 5
    Dernier message: 20/02/2012, 14h26
  3. [XL-2003] Lister les fichiers dans les dossiers et sous dossiers
    Par doncamelo dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/07/2010, 10h41
  4. Réponses: 4
    Dernier message: 16/12/2006, 19h13
  5. Pb avec code source "lister les images d'un dossier"
    Par Mimisator dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2005, 15h25

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