Code: Select all
NewList RechercheFichier.s() 
Procedure RechercheFichiers(Num.l, Dossier.s) 
  
  If Right(Dossier, 1) <> "\" : Dossier + "\" : EndIf ; On s'assure qu'il y a bien un \ à la fin du nom du dossier 
  
  If ExamineDirectory(Num, Dossier, "*.*") 
    Repeat 
      FileType = NextDirectoryEntry() 
      
      If FileType = 1 
        ; On a un fichier 
        Name.s = DirectoryEntryName() 
        AddElement(RechercheFichier()) 
        RechercheFichier() = ReplaceString(Left(Dossier, Len(Dossier) - 1), "\", "\?1?") + "\?2?" + Name 
        ; on met ?1? devant le nom des dossier et ?2? devant le nom des fichiers 
        ; Ainsi lors du tri des données, les dossiers seront placés avant les fichiers 
        ; Il suffira ensuite de supprimer les ?1? et ?2? des noms de fichiers ou dossiers 
        ; Le caratère ? n'étant pas utilisable dans les noms de fichiers, cet ajout ne présente aucun problème 
      ElseIf FileType = 2 
        ; On a un dossier 
        Name.s = DirectoryEntryName() 
        If Name <> "." And Name <> ".." 
          AddElement(RechercheFichier()) 
          RechercheFichier() = ReplaceString(Dossier, "\", "\?1?") + Name 
          
          ; On lance l'analyse sur ce nouveau dossier (analyse récursive) 
          RechercheFichiers(Num + 1, Dossier + Name) 
          
          ; On réactive le dossier de recherche en cours 
          UseDirectory(Num) 
          
        EndIf 
      EndIf 
      
    Until FileType = 0 
  EndIf 
  If Num = 0 
    ; si on a finit la recherche 
    
    ; On tri les noms de fichiers et dossiers 
    ; Je passe ici par un SortStructuredList car SortList à une erreur dans PB 3.93 avec le tri de listes chainés contenant du texte, ceci doit-être résolu pour les future version. 
    SortStructuredList(RechercheFichier(), 2, 0, #PB_Sort_String) 
    
    ; On retire les ?1? et ?2?, et également l'adresse du dossier d'origine 
    ForEach RechercheFichier() 
      RechercheFichier() = RemoveString(RemoveString(RemoveString(RechercheFichier(), "?1?"), "?2?"), Dossier) 
    Next 
  EndIf 
  
EndProcedure 
; On donne le nom du dossier dont on souhaite lister le contenu 
Dossier.s = "C:\Program Files\PureBasic\catalogs\" 
If Right(Dossier, 1) <> "\" : Dossier + "\" : EndIf ; On s'assure qu'il y a bien un \ à la fin du nom du dossier 
; On lance la recherche 
; Le premier paramêtre doit toujours être égal à 0 
RechercheFichiers(0, Dossier) 
; Ouvre une fenêtre 
If OpenWindow(0, 0, 0, 500, 200, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Recherche fichiers") = 0 Or CreateGadgetList(WindowID()) = 0 
  End 
EndIf 
; ListIconGadget(0, 0, 0, 500, 200, "Fichiers et dossiers", 470, #PB_ListIcon_FullRowSelect) 
TreeGadget(0, 0, 0, 500, 200) 
; On rempli la liste de fichier 
HideGadget(0, 1) ; Le fait de cacher le gadget permet de le remplir plus rapidement 
Nb_Dossier = 0 
n = 0 
ForEach RechercheFichier() 
  Temp = CountString(RechercheFichier(), "\") 
  If Temp < Nb_Dossier 
    Nb_Dossier - 1 
    CloseTreeGadgetNode(0) 
    AddGadgetItem(0, n, RechercheFichier()) 
  ElseIf Temp > Nb_Dossier 
    Nb_Dossier + 1 
    OpenTreeGadgetNode(0) 
    AddGadgetItem(0, n, RechercheFichier()) 
    SetGadgetItemState(0, n - 1, #PB_Tree_Expanded) 
  Else 
    AddGadgetItem(0, n, RechercheFichier()) 
  EndIf 
  
  n + 1 
  
Next 
SetGadgetState(0, 0) 
HideGadget(0, 0) 
Repeat 
  Event = WaitWindowEvent() 
  
Until Event = #PB_Event_CloseWindow