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

 Delphi Discussion :

Déterminer si un dossier est vide


Sujet :

Delphi

  1. #1
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut Déterminer si un dossier est vide
    Bonjour à tous,

    J'ai un soucis avec la création d'une fonction qui s'occupe de rechercher :

    1. Si un dossier est vide en application(s) (de type ".exe") et en dossier(s), dans ce cas elle renverrait True.
    2. Si un dossier n'est pas vide en application(s) elle renverrait False (on ne tien alors pas compte des dossiers).
    3. Si, enfin un dossier est vide en application(s) mais pas en dossier(s), elle effectuerait les mêmes vérifications sur le dossier trouvé jusqu'à trouvé un .exe, ou, si aucun .exe n'est trouvé elle renverrait False.


    Voilà ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function GoodExt(fic: string):boolean; //True si fic -> ".exe" False sinon
    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
     
    Function DossierEstVide(Dossier : string):boolean;
    var
      searchResult : TSearchRec;
    begin
      Result := True;
      //on enleve le '\' de la fin du dossier
      if Dossier[length(Dossier)]='\' then Dossier:=copy(Dossier,1,length(Dossier)-1);
        //on commence la recherche
        if FindFirst(Dossier+'\'+'*.*', faAnyFile-faHidden, searchResult) = 0 then
          begin
            repeat
              //on ignore '.' et '..'
              if (SearchResult.Name<>'.') and (SearchResult.Name<>'..') then
                begin
                //si le fichier trouvé à une bonne extension
                if ((SearchResult.Attr and faDirectory)=0) and GoodExt(searchresult.Name) then
                  begin
                    Result := False;
                  end
                  else if ((searchResult.Attr and faDirectory)<>0) then
                    begin
                      result := DossierEstVide(Dossier+'\'+searchresult.Name);
                    end;
                end;
            until FindNext(searchResult) <> 0;
            FindClose(searchResult);
      end;
    end;
    La fonction me renvoie bien False si elle a trouvé des ".exe" dans le dossier passé en paramètre.
    Par contre, elle me renvoie True même si des ".exe" ont été trouvés dans des sous dossiers du dossier passé en paramètre alors qu'elle devrait me renvoyer False.

    Ca fait un petit moment que je suis dessus, désemparé, je fais appel à vos connaissances.

    Merci d'avance.
    =)

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Salut, voisin

    Me semble que tu t'embrouilles car tu dis une chose et son contraire :
    Citation Envoyé par bionicleman Voir le message
    Si, enfin un dossier est vide en application(s) mais pas en dossier(s), elle effectuerait les mêmes vérifications sur le dossier trouvé jusqu'à trouver un .exe, ou, si aucun .exe n'est trouvé elle renverrait False.
    +++
    Par contre, elle me renvoie True même si des ".exe" ont été trouvés dans des sous dossiers du dossier passé en paramètre alors qu'elle devrait me renvoyer False.
    Je ne vois pas pourquoi ça devrait te renvoyer False puisqu'au moins un .exe est trouvé dans l'un des sous-dossiers de celui passé en paramètre, ce qui correspond à ton énoncé...

    Ou alors l'énoncé est faux ? :
    elle effectuerait les mêmes vérifications sur le dossier trouvé
    (qu'on pourrait d'ailleurs lire comme elle effectuerait les mêmes vérifications sur le(s) dossier(s) trouvé(s) )
    et on devrait comprendre
    elle effectuerait les mêmes vérifications sur le dossier passé en paramètre sans explorer les sous-dossiers


    Tu noteras que tu utilises une fonction récursive, donc tu explores bien les sous-dossiers s'il y en a.

    Pas clair, tout ça...

  3. #3
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Salut, et merci de ta réponse.

    Je ne vois pas pourquoi ça devrait te renvoyer False puisqu'au moins un .exe est trouvé dans l'un des sous-dossiers de celui passé en paramètre, ce qui correspond à ton énoncé...
    Et dans mon énoncé j'ai dis que la fonction renvoyait True si le dossier passé en paramètre est vide en application(s) (de type ".exe") et en dossier(s), et non le contraire .

    3. Si, enfin un dossier est vide en application(s) mais pas en dossier(s), elle effectuerait les mêmes vérifications sur le dossier trouvé jusqu'à trouvé un .exe, ou, si aucun .exe n'est trouvé elle renverrait False.
    Mon 3ième point correspond à la récursivité : recherche de fichiers ".exe" dans les sous-dossiers du dossier passé en paramètre.

    J'espère avoir été plus clair.

  4. #4
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((SearchResult.Attr and faDirectory)=0) and GoodExt(searchresult.Name) then
    est à remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if GoodExt(searchresult.Name) then
    Je pense qu'il y a plus simple mais ça devrait néanmoins marcher.

  5. #5
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Hey,

    C'est vrai.. j'aurais pu y penser.. : s'il a la bonne extension, c'est obligatoirement un fichier..

    Bref
    Je testerais ceci plus tard.

    Merci encore .

  6. #6
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Re tout le monde,
    J'ai donc testé avec un bout de code en moins (merci philnext )
    Ma fonction marche. Grande nouvelle. Même si j'y ai modifié 2 ou 3 trucs :

    Code delphi : 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
    Function DossierEstVide(Dossier : string):boolean;
    var
      searchResult : TSearchRec;
    begin
      Result := True;
      //on enleve le '\' de la fin du dossier
      if Dossier[length(Dossier)]='\' then Dossier:=copy(Dossier,1,length(Dossier)-1);
        //on commence la recherche
        if FindFirst(Dossier+'\'+'*.*', faAnyFile-faHidden, searchResult) = 0 then
          begin
            repeat
              //on ignore '.' et '..'
              if (SearchResult.Name<>'.') and (SearchResult.Name<>'..') then
                begin
                //si le fichier trouvé à une bonne extension
                if GoodExt(searchresult.Name) then
                  begin
                    Result := False;
                  end
                  else if ((searchResult.Attr and faDirectory)<>0) then
                    begin
                      result := result and DossierEstVide(Dossier+'\'+searchresult.Name);
                    end;
                end;
            until FindNext(searchResult) <> 0;
          end;
        FindClose(searchResult);
    end;
    Merci à tous.

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 830
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 830
    Points : 13 574
    Points
    13 574
    Par défaut
    Juste pour info, un dossier peut avoir une "extension" .exe (Le "." n'est pas un caractère interdit).

    Faire un teste sur faDirectory = 0 est tout à fait correct !

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

Discussions similaires

  1. Contrôler si un dossier est vide
    Par Jiyuu dans le forum VB.NET
    Réponses: 8
    Dernier message: 17/10/2007, 16h43
  2. [bash] Tester si un dossier est vide
    Par coincoin22 dans le forum Shell et commandes GNU
    Réponses: 22
    Dernier message: 30/07/2007, 20h19
  3. Vérifier qu'un dossier est vide
    Par coincoin22 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 26/07/2007, 17h58
  4. Réponses: 6
    Dernier message: 25/07/2007, 10h54
  5. comment savoir si un dossier est vide ou pas?
    Par Amissan dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 16/02/2007, 14h31

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