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 :

Soucis avec la fonction readdir.


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Soucis avec la fonction readdir.
    Salut, j'ai un soucis avec la fonction readdir.
    Celle-ci me renvoie trop de fichiers dont certains qui n'existent pas et certains sont listés deux fois.

    J'avais supprimé auparavant des fichiers dans le dossier de l'application et j'ai recrée plusieurs fois le dossier .

    Je n'ai que 4 fichiers dans le dossier : (test.hpp, test.cpp, main.cpp, test.out)

    Pour les lister, j'effectue ceci, en fait, je veux récupérer les noms des headers et des fichiers source pour les ouvrir.

    Code cpp : 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
     
    void ODFAEGCreator::showHeadersFiles(Label* label) {
        if (label->getChildren().size() == 0) {
            FontManager<Fonts>& fm = cache.resourceManager<Font, Fonts>("FontManager");
            std::vector<std::string> files;
            std::string cpath = getCurrentPath();
            findFiles("hpp", files, cpath+"/"+appliname);
            unsigned int y = label->getPosition().y + 10;
            unsigned int toMove = 0;
            for (unsigned int i = 0; i < files.size(); i++) {
                Label* lab = new Label(getRenderWindow(), Vec3f(0, y+toMove, 0), Vec3f(200, 10, 0),fm.getResourceByAlias(Fonts::Serif), files[i]);
                lab->setParent(lab);
                label->addChild(lab);
                toMove += 10;
            }
            std::vector<LightComponent*> children = label->getParent()->getChildren();
            for (unsigned int i = 0; i < children.size(); i++) {
                if (children[i]->getPosition().y > label->getPosition().y) {
                    children[i]->move(Vec3f(0, toMove, 0));
                    std::vector<LightComponent*> schildren = children[i]->getChildren();
                    for (unsigned int j = 0; j < schildren.size(); j++) {
                        schildren[j]->move(Vec3f(0, toMove, 0));
                    }
                }
            }
        } else {
            unsigned int y = label->getPosition().y + 10;
            std::vector<LightComponent*> children = label->getParent()->getChildren();
            int toMove = -children.size() * 10;
            for (unsigned int i = 0; i < children.size(); i++) {
                if (children[i]->getPosition().y > y) {
                    children[i]->move(Vec3f(0, toMove, 0));
                    std::vector<LightComponent*> schildren = children[i]->getChildren();
                    for (unsigned int j = 0; j < schildren.size(); j++) {
                        schildren[j]->move(Vec3f(0, toMove, 0));
                    }
                }
            }
            label->removeAll();
        }
    }

    Voici la fonction qui va rechercher les chemins des fichiers :

    Code cpp : 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
     
    void findFiles (std::string keyword, std::vector<std::string>& files, std::string startDir) {
                if (DIR* current = opendir(startDir.c_str())) {
                    dirent* ent;
                    while ((ent = readdir(current)) != NULL) {
                        if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) {
                            std::string path(ent->d_name);
                            if (ent->d_type == DT_DIR) {
                                findFiles(keyword, files, path);
                            } else if (path.find(keyword) != std::string::npos) {
                                files.push_back(path);
                            }
                        }
                    }
                    closedir(current);
                }
            }

    Dans les fichiers listé j'ai :

    Hors que le fichier .hpp n'existe pas.

    Dans les fichiers sources j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    main.cpp
    application.cpp
    .cpp (n'existe pas)
    main.cpp (déjà listé)
    test.cpp

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 388
    Points
    11 388
    Billets dans le blog
    11
    Par défaut
    Salut!

    Si au lieu de findFiles(keyword, files, path); (ligne 9 de findFiles), tu fais findFiles(keyword, files, startDir+ "/" + path);, Ca change quelque chose?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Non ça ne change rien mais il faut en effet faire comme cela.

    Merci bien.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 579
    Points
    218 579
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    .cpp (n'existe pas)
    Sous Linux, c'est un fichier caché. Donc, pas visible par défaut. On peut le voir en faisant "Ctrl + H" dans le navigateur de fichier ou ls -a
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 388
    Points
    11 388
    Billets dans le blog
    11
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Sous Linux, c'est un fichier caché
    It's not a bug, it's a feature. ^^
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #6
    Invité
    Invité(e)
    Par défaut
    It's not a bug, it's a feature. ^^
    Voici ce que ls -a m'affiche :
    Avec CTRL+H, pas de nouveau fichiers se rajoutent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .  ..  main.cpp  test.cpp  test.hpp  test.out

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 579
    Points
    218 579
    Billets dans le blog
    120
    Par défaut
    Alors, je pense que c'est une erreur de votre code, pour lequel, il rajoute .hpp
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Bonjour Lolilolight,

    Pourrais-tu, s'il te plait, implémenter ce code? Je suis curieux de voir ce que cela retourne...


    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
     
    void findFiles (std::string keyword, std::vector<std::string>& files, std::string startDir) {
                if (DIR* current = opendir(startDir.c_str())) {
                    dirent* ent;
     
                    int i = 0;
     
                    while ((ent = readdir(current)) != NULL) {
     
     
                        ++i;
                        std::string e_name(ent->d_name);
                        std::cout << "Entité : " << i << ", nom : " << e_name << ", type : " << ent->d_type << std::endl;
     
     
     
                        if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) {
                            std::string path(ent->d_name);
                            if (ent->d_type == DT_DIR) {
                                findFiles(keyword, files, path);
                            } else if (path.find(keyword) != std::string::npos) {
                                files.push_back(path);
                            }
                        }
                    }
                    closedir(current);
                }
            }

Discussions similaires

  1. Soucis avec la fonction WriteFile de windows
    Par kendra533 dans le forum Windows
    Réponses: 10
    Dernier message: 01/08/2007, 16h16
  2. [VBA] Soucis avec la Fonction Format
    Par kleenex dans le forum VBA Access
    Réponses: 4
    Dernier message: 11/06/2007, 11h17
  3. Souci avec la fonction SetFocus
    Par uranium-design dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/04/2007, 12h53
  4. [Système] P'tit soucis avec la fonction EXEC
    Par nais_ dans le forum Langage
    Réponses: 9
    Dernier message: 23/08/2006, 11h36
  5. pb avec la fonction readdir
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 10/08/2006, 17h03

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