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

Langage Delphi Discussion :

Problème avec FindFirst


Sujet :

Langage Delphi

  1. #1
    Membre éclairé Avatar de etranger
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut Problème avec FindFirst
    Bonsoir tout le monde

    voila j'ai une procedure qui traite les fichier d'un dossier pour cela j'utilise la fonction finfirst , seulement j'aimerai traiter que les fichier nomreaux , c'est à dire ni les fichier systémes, ni les répertoires, ni les fichiers cachés, ni les fichiers d'identification de volume.
    donc voila comment je procéde :
    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
    If FindFirst(filter,faAnyFile,Info)=0 then
      begin
        Repeat
          Inc(Count);
          With Info do
            begin
             if (name <> '.')
               and (name <> '..')
               and ((Attr and faDirectory) <> faDirectory )then
             begin
              ...
             end;
          end;
        Until FindNext(info)<>0;
      end;
      FindClose(Info);
    sa fonctione, mais se qui me gaine c'est le nombre de de test que je doit effectuer (avec les 'and'), et ici encore , je ne vérifie que si le fichier est un répertoire, je devrait donc encore ajouter 2 ou 3 tests !

    ma questions : y'a t'il une meilleure maniére de procéder ?

    merci d'avance

  2. #2
    Membre éclairé

    Inscrit en
    Novembre 2002
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 813
    Par défaut
    La procedure ci dessous devrait d'aider , en debut tu initialises tes contanste ( FileAttrs .. => faArchive...) en fonction des element que tu veux rechercher .
    Dans le cas ci dessous on recher les fichier archive et en lecture seule.
    Tu as toute les constantes pour les divers types dans l'aide de delphi ( findfirst)

    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
     
    procedure TFexport.lectureToutFichier;
    var
    sr:TSearchRec;
    FileAttrs:Integer;
    chemin:string;
    begin
         FileAttrs :=0;
         FileAttrs :=FileAttrs +faReadonly;
         FileAttrs :=FileAttrs +faArchive;
         chemin:=CheminFichierSource+'*.*';
         if FindFirst(chemin,FileAttrs,sr)=0 then
         begin
           repeat
               if(sr.Attr and FileAttrs)=sr.Attr then
               begin
                    ListBox1.Items.Add(sr.Name)
               end;
         until FindNext(sr)<>0;
         FindClose(sr);
         end;
    end;
    Bye.

  3. #3
    Membre éclairé Avatar de etranger
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Merci pour ta réponce

    Seulement il y a une chose, vous indiquez FileAttr comme filtre pour la fonction findfirst , puis après vous reéfectuez un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(sr.Attr and FileAttrs)=sr.Attr
    Pourquoi ? (si on aurai indiquer faAnyFile comme filtre j'aurai compris, mais là )

    et malheureusement, ce que je veux faire c'est exclure certaines sortes de fichiers du traitement , non pas en choisir une certaine sorte (comme dans ton exemple).

    donc je croi que cette solution soit la seulle :
    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
    If FindFirst(filter,faAnyFile,Info)=0 then
      begin
        Repeat
          With Info do
            begin
              if (name <> '.')
               and (name <> '..')
               and ((Attr and faHidden) <> faHidden )
               and ((Attr and faSysFile) <> faSysFile )
               and ((Attr and faVolumeID) <> faVolumeID )
               and ((Attr and faDirectory) <> faDirectory )
               then
              begin
              ....
              end;
            end;
        Until FindNext(info)<>0;
      end;
      FindClose(Info);
    Même si cette procedure n'est pas optimizée, comme elle n'est pas invoquer très frécaments (combien de fichiers peut contenir un dossier habituellement ?), ça ne géne pas .

    en tout cas merci pour avoir pris la paine de répondre

  4. #4
    Membre éclairé

    Inscrit en
    Novembre 2002
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 813
    Par défaut
    Tu en entierement raison aucun d'interet de refillter dans ma boucle !! (reflexe des fois idiot , de trop securisé )

    Par contre je ne perçois pas tout le raisonnement, entre exclure des element d'un ensemble donné ou choisir les autres , pour moi c'est pareil .


    dans tes test tu exclus .
    '.' , '..' , qui est la meme chose que fadirectory
    faHidden
    faSysFile
    faVolumeID

    donc il reste dans l'ensemble des attribut
    faReadOnly
    faArchive

    donc ma procedure devrai etre equivalente a la tienne , ( avec le test inutile en moins !!) ou alors j'ai pas compris lol

    bye !

  5. #5
    Membre éclairé Avatar de etranger
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Oh comme chu béte

    Tu a entierment raison, en fait le truc c'est que j'ai imaginer qu'il y avait d'autre types de fichiers que faArchive et faReadOnly (et les autres) , et qu'il falait maitre faAnyfile pour les detecter, en fait j'ai cru que faArchive designait des fichiers genre zip ou rar

    Ta solution fonctione sous windows, et elle doit surement aussi fonctioner sous Linux .

    Encore merci

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

Discussions similaires

  1. [AC-2007] problème avec FindFirst.
    Par lucViv dans le forum Access
    Réponses: 2
    Dernier message: 10/11/2014, 13h13
  2. Problème avec Findfirst
    Par Cabos dans le forum VBA Access
    Réponses: 5
    Dernier message: 09/03/2011, 16h32
  3. Problème avec FindFirst quand le critère contient "
    Par Mors_Ubyte dans le forum VBA Access
    Réponses: 5
    Dernier message: 22/05/2008, 10h13
  4. problème avec findfirst
    Par philpas dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 23/11/2005, 15h43
  5. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40

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