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

Windows Discussion :

[win32_find_data] Gros problème à détecter TOUS les dossiers (cause des attributs)


Sujet :

Windows

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut [win32_find_data] Gros problème à détecter TOUS les dossiers (cause des attributs)
    Bonjour,

    Un des bugs reportés conçernant mon programme est une incompatibilité de la recherche de fichiers musicaux sur tous les disques, à tous les ordinateurs. En effet, si un dossier possède des attributs différents de celui de base (à savoir FILE_ATTRIBUTE_DIRECTORY), il ne le détecte pas. En fait, pour le moment je teste si le dwFileAttributes est égal à FILE_ATTRIBUTE_DIRECTORY || [Celui ci plus FILE_ATTRIBUTE_SYSTEM] puisque c'est la seule variation qui m'a permis de faire marcher la fonction sur mon portable.

    Seulement, j'aimerais que la compatibilité soit totale avec les autres ordinateurs... Comment pourrais je faire pour savoir si dwFileAttributes comporte au moins la constante FILE_ATTRIBUTE_DIRECTORY ? Comme les flags sont combinés, je ne sais pas comment faire... j'ai pourtant remarqué que tous ceux ci sont des puissances de 2 ...

    Sauriez vous comment faire ?

    Merci d'avance.
    Vive l'embarqué.

  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 518
    Points
    41 518
    Par défaut
    Code C/C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
    }
    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
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Tu as sûrement raison ... dans ce cas là je ne m'en serais jamais douté. MAIS cela ne marche toujours pas ... 0 musiques dans chacun de mes lecteurs logiques... Si ça peut vous aider, voici ma fonction (utilisant la récursivité) précédée d'une autre utilisée pour récupérer tout ce qu'il y a avant le dernier slash.

    Voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char *findFilePath(char *exPath)
    {
        char *P_index = strrchr(exPath,'\\');
    
        if (P_index) {
            *P_index = 0;
        }
    
        return exPath;
    }
    et la fameuse :
    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
    int exploreDirectory(char *currentDir, MUSICDATA *data)
    {
        WIN32_FIND_DATA foundData;
        HANDLE search;
        char temp[512];
    
        strcpy(temp, currentDir);
    
        findFilePath(temp);
    
        search = FindFirstFile(currentDir, &foundData);
        if (search == INVALID_HANDLE_VALUE)
            return 0;
    
        for(int i = 1 ; ; i++)
            {
                if((FindNextFile(search, &foundData)==0) && (GetLastError() == ERROR_NO_MORE_FILES))
                    break;
    
                if(foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    char temp2[512];
    
                    if((strcmp(foundData.cFileName,"..") == 0) || (strcmp(foundData.cFileName,"WINDOWS") == 0))
                        continue;
    
                    strcpy(temp2,temp);
                    strcat(temp2, "\\");
                    strcat(temp2, foundData.cFileName);
                    strcat(temp2, "\\*.*");
    
                    exploreDirectory(temp2, data);
                }
                else if(((strstr(foundData.cFileName, ".mp3")!=NULL) ||
                    (strstr(foundData.cFileName, ".wav")!=NULL) ||
                    (strstr(foundData.cFileName, ".wma")!=NULL) ||
                    (strstr(foundData.cFileName, ".ogg")!=NULL))&&(strstr(foundData.cFileName, ".lnk")==NULL))
                    {
                        strcpy(data->path[data->numberItems], temp);
                        strcat(data->path[data->numberItems], "\\");
                        strcat(data->path[data->numberItems], foundData.cFileName);
                        strcpy(data->name[data->numberItems], foundData.cFileName);
                        data->numberItems++;
                    }
            }
    
            FindClose(search);
    
            return 1;
    }
    Vive l'embarqué.

  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 518
    Points
    41 518
    Par défaut
    Hum... Je ne peux pas trop déboguer comme ça, mais déjà, tu peux commencer par afficher sur la sortie standard ou le debug le chemin de chaque répertoire parcouru.
    Ainsi, tu verras si tu en loupes ou non...
    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
    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
    Ca ne répond pas exactement à ta question, mais ceci est très laid et n'est pas portable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                   if((... || (strcmp(foundData.cFileName,"WINDOWS") == 0))
                        continue;
    parce que :

    1. le dossier 'Windows' peut porter n'importe quel autre nom.

    2. il peut y avoir plusieurs dossiers 'Windows' sur la même partition ...
    "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

  6. #6
    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 518
    Points
    41 518
    Par défaut
    Ah, je ne l'avais pas vu celui-là (oubli de scroller).
    Tu peux tester comparer avec le résultat de GetWindowsDirectory(), mais si le chemin n'est pas au même format... (genre d'un cote "C:\\Windows", de l'autre "\\\\.\\C:\\Windows", etc., sans parler de la casse...)
    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.

  7. #7
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Ah non mais ça ce n'est pas du tout important ... c'est juste pour éviter d'avoir les petits sons windows... mais cela ne marche pas de toute façon... sur le portable j'avais toujours ( en première position qui plus est ) "veuillez entrer vos logins et mots de passe"

    Conçernant les tests, je peux te certifier que des dossiers sont "ignorés" -> Il liste bien mais ne rentre pas dans la condition que j'utilise pour les dossiers... j'avais eu le même problème sur le portable quand j'avais fait pour la premiere fois la fonction.

    Je pense à un truc d'ailleurs ... il me semble qu'il ne rentre pas dans le "if" des dossiers quand le dossier comporte une icône ou tout du moins une defaulticon différente... Par exemple, sur le portable j'avais le skin vista (un brico pack) et les dossiers étaient "skinnés" avec des couleurs différentes. En enlevant ces skins, cela marchait : Donc les attributs changent quand le dossier comporte une icône...

    Je vais essayer de tester le dwFileAttributes mais bon... cela sera encore un cas particulier et ne sera donc pas portable...

    Sauriez vous d'où cela peut provenir ou tout du moins une idée ?
    Vive l'embarqué.

  8. #8
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Up
    Vive l'embarqué.

  9. #9
    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 kidpaddle2
    Donc les attributs changent quand le dossier comporte une icône...
    Pas chez moi en tout cas (XP Pro SP2)...

    As-tu essayé en faisant un petit programme console qui affiche simplement TOUS les attributs (obtenus avec FindxxxFile()) des sous-répertoires d'un répertoire donné ?
    "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

  10. #10
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Oui mais au tout début. C'était quand je codais la fonction (et que j'avais déjà ce problème). A ce moment là, l'attribut posant problème était (en int) 20. Ce qui correspondait je crois à DIRECTORY + SYSTEM alors que ce n'en était pas un (system). Bref je trouve ce système vraiment rasoir alors si vous avez une bibliotèque qui me permettrait de le faire plus simplement prévenez moi ou alors dites moi si tous les attributs ne sont pas donnés sur msdn.
    Même avec une recherche comme tu le dis, j'obtiendrais encore des cas particuliers et rien de portable.

    La solution de Médinoc était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(foundData.dwFileAttributes == & FILE_ATTRIBUTE_DIRECTORY)
    Mais même si je suis sûr qu'il dit vrai, cela ne marche pas.
    Vive l'embarqué.

  11. #11
    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 kidpaddle2
    La solution de Médinoc était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(foundData.dwFileAttributes == & FILE_ATTRIBUTE_DIRECTORY)
    Mais même si je suis sûr qu'il dit vrai, cela ne marche pas.
    Erreur de frappe, probablement.

    Ce serait plutôt ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    "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

  12. #12
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Oui désolé c'est effectivement cela...
    Vive l'embarqué.

  13. #13
    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 518
    Points
    41 518
    Par défaut
    Tu vois, l'API Win32 est une chose merveilleuse, quand on s'en sert bien...

    Et ne répète plus jamais que mes solutions ne marchent pas
    Non mais!
    Et pour la peine, vous me ferez cinquante pompes, soldat!
    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.

  14. #14
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Euh je ne veux pas te gacher ce moment d'exhaltation mais c'était une erreur de frappe sur le forum. Je l'avais bien écrit dans mon code et pourtant cela ne marche pas
    Bizarre...
    Vive l'embarqué.

  15. #15
    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 518
    Points
    41 518
    Par défaut
    Un répertoire, personalisé ou non, aura toujours l'attribut répertoire.
    Sachant que cet attribut est un bit, le test teste simplement si le bit est à 1 ou non, donc il doit être vrai pour tous les répertoires.

    Par contre, tu devrais aussi sauter le répertoire ".", en plus de "..".
    Ces deux répertoires créent des cycles, alors que la recherche est un parcours d'arbre...
    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.

  16. #16
    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 kidpaddle2
    A ce moment là, l'attribut posant problème était (en int) 20. Ce qui correspondait je crois à DIRECTORY + SYSTEM alors que ce n'en était pas un (system).
    20 (0x14) = (FILE_ATTRIBUTE_DIRECTORY | FILE_SHARE_DELETE)

    je crois que tu devrais bien revérifier tous tes tests sur les attributs : il faut absolument masquer la valeur retournée sinon ça ne marchera jamais; tu auras toujours d'autres attributs qui viendront parasiter les tests.

    Et je doute fortement que le système soit en cause ici...
    "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

  17. #17
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Médinoc -> Merci mais cela marchait avant pourtant ...
    Rigobert -> D'où l'emploi de je crois. Mais c'est bizarre alors ... pourquoi ne les détecte t il pas ?
    Vive l'embarqué.

  18. #18
    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 kidpaddle2
    Mais c'est bizarre alors ... pourquoi ne les détecte t il pas ?
    Je ne comprends pas ta question .
    Quoiqu'il en soit, la valeur retournée (20) signale bien un dossier et est donc parfaitement valide.
    "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

  19. #19
    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 518
    Points
    41 518
    Par défaut
    Au fait : FILE_SHARE_DELETE n'est pas un attribut, et ce n'est pas dans le même paramètre de CreateFile().
    Code C/C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #define FILE_ATTRIBUTE_READONLY             0x00000001  
    #define FILE_ATTRIBUTE_HIDDEN               0x00000002  
    #define FILE_ATTRIBUTE_SYSTEM               0x00000004  
    #define FILE_ATTRIBUTE_DIRECTORY            0x00000010  
    #define FILE_ATTRIBUTE_ARCHIVE              0x00000020  
    #define FILE_ATTRIBUTE_DEVICE               0x00000040  
    #define FILE_ATTRIBUTE_NORMAL               0x00000080  
    #define FILE_ATTRIBUTE_TEMPORARY            0x00000100  
    #define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200  
    #define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400  
    #define FILE_ATTRIBUTE_COMPRESSED           0x00000800  
    #define FILE_ATTRIBUTE_OFFLINE              0x00001000  
    #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000  
    #define FILE_ATTRIBUTE_ENCRYPTED            0x00004000
    4 correspond bien à FILE_ATTRIBUTE_SYSTEM, et les valeus des attributs sont uniques (contrairement aux droits, par exemple).
    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.

  20. #20
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Merci médinoc, je me disais aussi ...

    Conçernant ta question rigobert, je veux dire par là qu'il ne rentre pas dans ma condition if(foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY), puisqu'il ne trouve aucune musique dans une partition ne contenant presque que cela.
    Et le premier dossier, à la racine, en est un illustré : il possède une icone donc je me suis dit que peut être ... cela venait de là. Mais bon apparemment cela n'est pas la cause, alors je ne sais pas du tout comment je vais faire pour régler ce bug.
    Vive l'embarqué.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Gros problème: perdu tous les ports USB
    Par Gui13 dans le forum Windows 7
    Réponses: 7
    Dernier message: 16/06/2010, 21h26
  2. Dans la rubrique "tous les dossiers courriers"
    Par JCHOUTEAU dans le forum Outlook
    Réponses: 1
    Dernier message: 25/06/2007, 11h00
  3. Parcourir tous les dossiers ou fichiers d'un disque
    Par bl4ckwolf dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/07/2006, 19h55
  4. rechercher des fichiers dans tous les dossiers
    Par nitteo dans le forum MFC
    Réponses: 4
    Dernier message: 23/06/2006, 18h08
  5. Problème avec TOUS les évenements
    Par loicbar dans le forum Access
    Réponses: 11
    Dernier message: 14/05/2006, 11h23

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