Fonction de recherche d'un fichier

Programmation d'applications complexes
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Fonction de recherche d'un fichier

Message par lionel_om »

Voici une petite fonction bien utile.
Il existe peut-être déjà des fonctions ou autre à ce sujet, mais voilà la mienne :lol: ...

C'est une fonction récursive ( IUT powa! :D )

Code : Tout sélectionner

Chemin.s = "D:\"
fileToFind.s = "install.tx"
Global nbDossierParcouru.l
nbDossierParcouru = 0


Procedure.s LookForFile(file$,dossier$, numRep.l)
;   Fonction récursive de recherche d'un fichier
  ; file : fichier à rechercher
  ; dossier : dossier de départ de l'analyse
  ; numRep : #Repertoire utilisé pour ExamineDirectory()

  If Right(dossier$,1)<>"\"
    dossier$ = dossier$ + "\"
  EndIf
  
  If ExamineDirectory(numRep, dossier$, "*.*")
  rep.s = ""
  nbDossierParcouru = nbDossierParcouru + 1

    Repeat
      fileType = NextDirectoryEntry()   ; recupération du type du fichier

    ; analyse sur les dossiers
      If fileType = 2
        fileName$ = DirectoryEntryName()  ; recup du nom du fichier/dossier
        If fileName$ <> "." And fileName$<>".."
          ; ajout à la ListBox
          AddGadgetItem(2, -1, "> " + fileName$)
          rep$ = LookForFile(file$, dossier$ + fileName$, numRep+1)
             ; si la récursivité a trouvé le fichier, on sort de la fonction
             If rep$ <> "": ProcedureReturn rep$ : EndIf
          ; numRep redevient le dossier d'examen courant
          UseDirectory(numRep)
        EndIf
      EndIf
      
    ; analyse sur les fichiers
      If fileType = 1 And DirectoryEntryName() = file$
        ; si on a trouvé, on sort de la fonction
        ProcedureReturn dossier$
      EndIf   
         
    Until FileType = 0  ; tant que le dossier n'est pas vide
  EndIf
  
ProcedureReturn ""

EndProcedure



If OpenWindow(0, 100, 200, 340, 340, #PB_Window_SystemMenu, "PureBasic - FileSystem Example")

 If CreateGadgetList(WindowID())
    StringGadget  (0,  10, 10, 202, 24, "")
    SetGadgetText (0, Chemin)
    ButtonGadget  (1, 220, 10, 60 , 24, "Start")
    ListViewGadget(2,  10, 70, 320, 250)
    StringGadget  (3,  10, 40, 202, 24, "")
    SetGadgetText (3, fileToFind)    
  EndIf

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_EventGadget
      ; appuie sur le boutton
      If EventGadgetID() = 1

        ClearGadgetItemList(2) 

        ; appel de la fonction pour trouver le fichier
        result.s = LookForFile(GetGadgetText(3), GetGadgetText(0),0)

        ; message en fonction des résultats
        If result <> ""
          msg.s = fileToFind+" a été trouvé dans le dossier :"+ Chr(13)+Chr(10)+result
        Else
          msg.s = "Impossible de trouver "+fileToFind
        EndIf
        MessageRequester("Search in "+Str(nbDossierParcouru)+" folders", msg, #PB_MessageRequester_Ok)

      EndIf
    EndIf

  Until EventID = #PB_EventCloseWindow

EndIf

End
Pour l'instant ca ne marche que depuis un répertoire, mais je vais étendre cela à la racine !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

ça n'a rien de nouveau où y a un truc que j'ai pas vu :roll:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Bah je ne sais pas si qq1 à déjà fais ca avant
Mais j'avais envi de m'amuser à faire un petit programme comme ça, car j'utilise plus 3D GC que PB et il faudrait que je me mette à ce petit langage bien simpa et hyper puissant !!!

Donc possible que qq1 est déjà poster un truc dans le genre... mais bon si ca peut dépanner qq1 8) :D
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Salut Lionel (on se connais déjà^^)
il faudrait que je me mette à ce petit langage bien simpa et hyper puissant !!!
Petit ? plus complet que DarkBASIC en tout cas, sérieux, essayer PureBASIC c'est l'adopter.
En plus pour ton RPG 2D, le faire passer au Pure n'a que des avantages

;)
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Oui je sais Aranoth, mais pour l'instant je mis connais mieux en DB qu'en PB.
mais là je me mets à PB. Je suis en train de faire un converstisseur d'image. Il faut dailleur que je recherche sur le forum comment récupérer une clé de registre (pour un entier je sais comment, mais là c'est un string :? ).

Donc oui je sais qu'il est meiux que DB (de loin) et Dri me l'avais dailleurs conseilé pour mon RPG. Je savais que je fesais une erreur, mais j'ai voulu voir ce qu'il avais dans le ventre, et il ne s'en est pas mal sortis qd mm ! :D

Mais c'est vrai que PB est largement plus puissant !!!
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

J'avais déjà fait ce genre de fonction dans un vaste programme qui a donné lieu a de chaudes discussions. Reste plus qu'a comparer :P
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
langa68
Messages : 56
Inscription : dim. 29/avr./2007 16:03

Message par langa68 »

Salut,

Je recherche un truc dans ton genre. J'ai copié ton code, puis je l'ai lancé,
voici le message que j'ai eu:

Ligne 22-NextDirectoryEntry(): Incorrect number of parameters.

Dans ton post tu dis que tu veux étendre ton code pour qu'il fonctionne jusqu'à la racine.

Je suis très intéressé par cela. (Si possible avec les explications du code car je suis nouveau en PB).

Merci

langa68
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

J'ai pas expliqué mais je te l'ai adapté pour PB 4.10
Mais ne fonctionne pas en mode récursif, seulement dans un dossier.

Code : Tout sélectionner

Chemin.s = "C:\"
fileToFind.s = "setup.exe"
Global nbDossierParcouru.l
nbDossierParcouru = 0


Procedure.s LookForFile(file$,dossier$, numRep.l)
;   Fonction récursive de recherche d'un fichier
  ; file : fichier à rechercher
  ; dossier : dossier de départ de l'analyse
  ; numRep : #Repertoire utilisé pour ExamineDirectory()

  If Right(dossier$,1)<>"\"
    dossier$ = dossier$ + "\"
  EndIf
 
  If ExamineDirectory(numRep, dossier$, "*.*")
  rep.s = ""
  nbDossierParcouru = nbDossierParcouru + 1

    Repeat
      fileType = NextDirectoryEntry(numRep)   ; recupération du type du fichier

    ; analyse sur les dossiers
      If fileType = 2
        fileName$ = DirectoryEntryName(numRep)  ; recup du nom du fichier/dossier
        If fileName$ <> "." And fileName$<>".."
          ; ajout à la ListBox
          AddGadgetItem(2, -1, "> " + fileName$)
          rep$ = LookForFile(file$, dossier$ + fileName$, numRep+1)
             ; si la récursivité a trouvé le fichier, on sort de la fonction
             If rep$ <> "": ProcedureReturn rep$ : EndIf
          ; numRep redevient le dossier d'examen courant
          ;UseDirectory(numRep)
        EndIf
      EndIf
     
    ; analyse sur les fichiers
      If fileType = 1 And DirectoryEntryName(numRep) = file$
        ; si on a trouvé, on sort de la fonction
        ProcedureReturn dossier$
      EndIf   
         
    Until FileType = 0  ; tant que le dossier n'est pas vide
  EndIf
 
ProcedureReturn ""

EndProcedure



If OpenWindow(0, 100, 200, 340, 340, "PureBasic - FileSystem Example", #PB_Window_SystemMenu)

 If CreateGadgetList(WindowID(0))
    StringGadget  (0,  10, 10, 202, 24, "")
    SetGadgetText (0, Chemin)
    ButtonGadget  (1, 220, 10, 60 , 24, "Start")
    ListViewGadget(2,  10, 70, 320, 250)
    StringGadget  (3,  10, 40, 202, 24, "")
    SetGadgetText (3, fileToFind)   
  EndIf

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget
      ; appuie sur le boutton
      If EventGadget() = 1

        ClearGadgetItemList(2)

        ; appel de la fonction pour trouver le fichier
        result.s = LookForFile(GetGadgetText(3), GetGadgetText(0),0)

        ; message en fonction des résultats
        If result <> ""
          msg.s = fileToFind+" a été trouvé dans le dossier :"+ Chr(13)+Chr(10)+result
        Else
          msg.s = "Impossible de trouver "+fileToFind
        EndIf
        MessageRequester("Search in "+Str(nbDossierParcouru)+" folders", msg, #PB_MessageRequester_Ok)

      EndIf
    EndIf

  Until EventID = #PB_Event_CloseWindow

EndIf

End
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Problème de portage. voici le code fonctionnel sous PB 4.xx :

Code : Tout sélectionner

Chemin.s = "C:\"
fileToFind.s = "Setup.exe"

Procedure.s LookForFile(file$,dossier$)
  ;   Fonction récursive de recherche d'un fichier
  ; file : fichier à rechercher
  ; dossier : dossier de départ de l'analyse
  
  If Right(dossier$,1)<>"\"
    dossier$ = dossier$ + "\"
  EndIf
  
  hDir.l = ExamineDirectory(#PB_Any, dossier$, "*.*")
  If hDir
    rep.s = ""
    
    While NextDirectoryEntry(hDir)
      fileType = DirectoryEntryType(hDir)   ; recupération du type du fichier
      
      ; analyse sur les dossiers
      If fileType = #PB_DirectoryEntry_Directory
        fileName$ = DirectoryEntryName(hDir)  ; recup du nom du fichier/dossier
        If fileName$ <> "." And fileName$ <> ".."
          ; ajout à la ListBox
          AddGadgetItem(2, -1, "> " + fileName$)
          rep$ = LookForFile(file$, dossier$ + fileName$ + "\")
          ; si la récursivité a trouvé le fichier, on sort de la fonction
          If rep$ <> ""
            ProcedureReturn rep$
          EndIf
        EndIf
      
      
      ; analyse sur les fichiers
      ElseIf fileType = #PB_DirectoryEntry_File And DirectoryEntryName(hDir) = file$
        ; si on a trouvé, on sort de la fonction
        ProcedureReturn dossier$
      EndIf   
      
    Wend
  EndIf
  
  ProcedureReturn ""
  
EndProcedure



If OpenWindow(0, 100, 200, 340, 340, "PureBasic - FileSystem Example", #PB_Window_SystemMenu)
  
  If CreateGadgetList(WindowID(0))
    StringGadget  (0,  10, 10, 202, 24, "")
    SetGadgetText (0, Chemin)
    ButtonGadget  (1, 220, 10, 60 , 24, "Start")
    ListViewGadget(2,  10, 70, 320, 250)
    StringGadget  (3,  10, 40, 202, 24, "")
    SetGadgetText (3, fileToFind)   
  EndIf
  
  Repeat
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget
      ; appuie sur le boutton
      If EventGadget() = 1
        
        ClearGadgetItemList(2)
        
        ; appel de la fonction pour trouver le fichier
        result.s = LookForFile(GetGadgetText(3), GetGadgetText(0))
        
        ; message en fonction des résultats
        If result <> ""
          msg.s = fileToFind+" a été trouvé dans le dossier :"+ Chr(13)+Chr(10)+result
        Else
          msg.s = "Impossible de trouver "+fileToFind
        EndIf
        MessageRequester("Search in "+Str(nbDossierParcouru)+" folders", msg, #PB_MessageRequester_Ok)
        
      EndIf
    EndIf
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf

End
Bien entendu, le fichier est recherché de façon récursive...

Lio :wink:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre