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 :

Comment rechercher un fichier sur le disque ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut Comment rechercher un fichier sur le disque ?
    salut
    comme l'intitulé le stipule, j'aimerai savoir s'il était possible de chercher un fichier sur le c à travers delphi.
    supposons que je depose un edit sur la fiche et l'utilisateur se charge de saisir dans cet edit, le nom du fichier et mon programme affiche dans un autre edit le chemin complet pour arriver au fichier. Au cas ou le fichier se trouverait dans plusieurs repertoires par exemple, je ne prends rien qu'un seul chemin.
    si cela est realisable, j'aimerai savoir comment on realise.
    l'idée m'est venu lorsque je faisais une recherche d'un fichier à travers windows, donc je me suis dit pourquoi pas un logiciel qui fait cela.
    A+

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut
    salut
    je viens à l'instant, de voir comment realiser cela et je le partage avec vous. mais quelqu'un pense qu'il y'a mieux que ça, je reste à son écoute.

    Rechercher un fichier sur un lecteurs
    Rechercher un fichier sur plusieurs lecteurs
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    unit UFindFile;
     
    interface
    Function RechercheFichier(Nom,Chemin:String):String;
    Function ChercherFichier(Nom : String; Depart,Arrivee : Byte):String;
     
    implementation
    Uses Sysutils;
     
    Function RechercheFichier(Nom,Chemin:String):String;
    Var SR : TSearchRec;
        R : Integer;
        V : String;
    Begin
      If FileExists(Chemin+Nom) Then
      Begin
        RechercheFichier:=Chemin+Nom;
        Exit;
      End;
      R:=FindFirst(Chemin+'*.*',16,SR);
      While R=0 Do
      Begin
        If (SR.Name<>'.') And (SR.Name<>'..') Then
        Begin
          V:=RechercheFichier(Nom,Chemin+SR.Name+'\');
          If V<>'' Then
          Begin
            RechercheFichier:=V;
            Exit;
          End;
        End;
        R:=FindNext(SR);
      End;
      RechercheFichier:='';
    End;
     
    Function ChercherFichier(Nom : String; Depart,Arrivee : Byte):String;
    Var Lecteur : String;
        I : Byte;
        Valeur : String;
    Begin
      I:=Depart;
      Valeur:='';
      While I<=Arrivee Do
      Begin
        Lecteur:=CHR(I+65)+':\';
        Valeur:=RechercheFichier(Nom,Lecteur);
        If Valeur='' Then
        Begin
          Inc(I);
        End
        Else
        Begin
          ChercherFichier:=Valeur;
          Exit;
        End;
      End;
      ChercherFichier:='';
    End;
     
    End.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Il y a un truc qui m'intrigue dans le code de la Function RechercheFichier(Nom,Chemin:String): String;

    Dès lors que tu as exécuté la ligne If FileExists(Chemin+Nom) cette fonction aura scanné tous les fichiers du réperoire 'Chemin' portant le nom 'Nom' et comme il ne peut y avoir dans le même répertoire deux fichiers portant le même nom le problème est réglé.

    ... Donc à quoi sert la suite à partir de la ligne R:=FindFirst(Chemin+'*.*',16,SR); puisque cette suite scanne le même répertoire nommé Chemin et renvoie les noms de tous les autres fichiers présents ??

    Pour vérifier si le fichier 'monFichier.txt' est présent dans plusieurs répertoires on peut s'arrêter juste après le If FileExists(Chemin+Nom) et rappeler la fonction RechercheFichier(Nom,Chemin:String): String; en changeant le paramètre 'Chemin'.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut
    ok, j'ai pigé ta proposition et je vais de ce pas l'essayer et de te faire part de ça.
    A++

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-Salut,

    Tiens, si ça t'intéresse voiçi du code qui te renvoie la liste de tous les dossiers et sous-dossiers correspondant à ton paramètre 'Chemin' :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     
    uses Windows, Classes, SysUtils, Dialogs;
    ...
    ...
    implementation
     
    {$R *.DFM}
    //  ======================================================
    //    Arborescence des dossiers par récursivité indirecte
    //  ======================================================
     
      var SLDir : TStringList; // liste pour résultat
     
      function IncludeTrailing(const S: string) : string;
      //Met un "\" à la fin du nom du dossier s'il manque
      //La fonction IncludeTrailingDelimiter n'est pas implémentée dans Delphi 3
      begin
        Result:=S;
        if not IsPathDelimiter(Result,Length(Result)) then Result:=Result+'\';
      end;
     
      function IsDirectory(SRec:TSearchRec) : boolean;
      // Renvoie True si le paramètre est un dossier
      begin
        IsDirectory:= SRec.Attr and faDirectory <> 0;
      end;
     
    procedure AddSubDirs(Dir,Mask : string; Index:integer);
    var       AttrWord     : integer;
              Pntr, s1, s2 : string;
              SR           : TSearchRec; //variable de recherche
    begin
              AttrWord:=faDirectory or faReadOnly or faArchive or faHidden or faSysFile;
        {$I-} ChDir(Dir); {$I+} //évite des erreurs ES
              while Mask<>'' do
              begin
                 // Prend le 1er masque dans le filtre
                 if Pos(';',Mask)=0 then Pntr:=Mask
                 else Pntr:=Copy(Mask,1,Pos(';',Mask)-1);
                 // Recherche des dossiers
                 if FindFirst(IncludeTrailing(Dir)+Pntr, AttrWord, SR)=0 then
                 begin
                    repeat
                       s1:=ExtractFileName(SR.Name); // nom du prétendu dossier
                       s2:=IncludeTrailing(Dir+s1);  // chemin complet du fichier ou dossier
                       if (s1<>'.') and (s1<>'..') and (IsDirectory(SR)) then // on ne garde que les dossiers
                       SLDir.Insert(Index+1, UpperCase(s2)); // ajout du dossier à la récurrence. Sera récursé au prochain passage
                    until FindNext(SR)<>0;  // arrêt s'il n'y a plus rien
                    SysUtils.FindClose(SR);
                 end;
                 // On passe au filtre suivant s'il en reste
                 if Pos(';',Mask)=0 then Break
                 else Mask:=Copy(Mask,Pos(';',Mask)+1,Length(Mask));
              end; // while Mask..
    end; // AddSubDirs
     
    procedure RecurseSubFolder(Racine : string);
    var       Index : integer;
    begin
              Racine:=IncludeTrailing(Racine); //répertoire racine
              SLDir.Clear; //on vide le résultat pour commencer
              SLDir.Add(UpperCase(Racine)); //initialisation de la récurrence
              Index:=0; //on démarre à 0
              //Récurrence indirecte
              repeat
                 AddSubDirs(SLDir[Index],'*.*',Index); // on ajoute les sous-dossiers
                 inc(Index); //on passe à l'item suivant
              until (Index>=SLDir.Count);
              SLDir.Sort; //on trie pour achever si besoin est
    end; // RecurseSubFolder
    ... et pour l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Bouton1Click(Sender : TObject);
    begin     // initialisation :
              SLDir:=TStringList.Create;
              // Execution :
              RecurseSubFolder('c:\program files\');
              // Visu du résultat :
              ShowMessage(SLDir.Text);
              // finalisation :
              SLDir.Free;
    end.
    ... mais au lieu de faire le ShowMessage(SLDir.Text); tu peux récupérer les 'Chemin' individuellement dans une boucle comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       for i:=0 to SLDir.Count-1 do 
       begin Chemin:=SLDir[i];  
             //traitement utilisant la variable Chemin
             If FileExists(Chemin+Nom) 
             Then memo1.lines.Add('Trouvé '+Nom+' dans dossier '+Chemin);
       end;
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut
    salut Gilbert
    tu as tout à fait raison sur ta remarque. tu m'escuse du temps que j'ai mis à repondre, je participe au forum dans un cyber et je code à la maison du fait que delphi n'est pas installé dans les cybers.
    Ton code est plus pratique que le mien, je l'essayerai des que je suisà la maison.
    merci.

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

Discussions similaires

  1. [VB.NET] Comment rechercher des fichiers sur un disque.
    Par vijeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/08/2017, 10h17
  2. Rechercher un fichier sur le disque dur
    Par michelp3 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/05/2012, 15h04
  3. [Toutes versions] Recherche de fichiers sur le disque
    Par ZeitnotZatopek dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 22/10/2009, 12h52
  4. Rechercher un fichier sur le disque dur et le sup.
    Par Kysers95 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/09/2007, 00h38
  5. Réponses: 3
    Dernier message: 16/11/2006, 11h54

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