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