Et comme je trouve idiot de coder ce qui l'est déjà, je te donne un exemple que tu retravailles comme tu le souhaites.
Cet exemple, qui illustre la récursivité, fait aussi appel à un thread afin d'éventuellement stopper la boucle récursive.
Code : Tout sélectionner
; Parcourir l'arborecence d'un dossier
;
Enumeration
#MainForm
#StartStop
#ListFiles
#CountFiles
EndEnumeration
Global CountFiles.i, IdThread.i
;By Flype. Modifié pour illustrer ta demande
Procedure.s ParseDirectory(Folder.s, id.l=0, Filter.s="*.*")
If Right(Folder, 1) <> "\"
Folder + "\"
EndIf
If ExamineDirectory(id, Folder, "*.*")
While NextDirectoryEntry(id) And GetGadgetData(#StartStop)=#True
If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".."
If GetExtensionPart(DirectoryEntryName(id))=Filter
AddGadgetItem(#ListFiles,-1, folder +Chr(10)+DirectoryEntryName(id))
CountFiles+1
SetGadgetText(#CountFiles, Str(CountFiles))
EndIf
If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
ParseDirectory(Folder + DirectoryEntryName(id), id + 1, Filter)
EndIf
EndIf
Wend
FinishDirectory(id)
EndIf
EndProcedure
;Parcours d'un dossier ou d'une unité de stockage
Procedure StartThread(*Value)
ClearGadgetItems(#ListFiles)
CountFiles=0
;Indiquez ici le filtre de selection
ParseDirectory("C:",0, "doc")
;Le parcours est terminée
SetGadgetText(#StartStop, "Start")
SetGadgetData(#StartStop, #False)
MessageRequester("Info", "Parcours terminé"+#CRLF$+Str(CountFiles)+" Fichier(s) trouvé(s)")
EndProcedure
;Affichage de la fenetre principale
Procedure MainFormShow()
OpenWindow(#MainForm,0,0,500,400,"Lecture d'un dossier(Thread)",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
TextGadget(#PB_Any, 5, 10, 50, 20, "Fichier(s)")
TextGadget(#CountFiles, 100, 10, 80, 20, "0")
ListIconGadget(#ListFiles, 5, 30, 390,250, "Dossier", 250, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#ListFiles, 1, "Fichier",230)
ButtonGadget(#StartStop, 170, 270, 70, 20, "Start")
;On evite en principe le scintillement
;du au resize de la fenetre
SmartWindowRefresh(#Mainform, #True)
EndProcedure
MainFormShow()
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #StartStop
If GetGadgetData(#StartStop)=#False
SetGadgetData(#StartStop, #True) ;Indiquer au bouton que le parcours est actif
SetGadgetText(#StartStop, "Stop")
IdThread=CreateThread(@StartThread(), 0)
Else
SetGadgetData(#StartStop, #False) ;Indiquer au bouton que le parcours est desactivé
SetGadgetText(#StartStop, "Start")
If IsThread(IdThread)
PauseThread(IdThread)
EndIf
EndIf
EndSelect
Case #PB_Event_SizeWindow
WWidth=WindowWidth(#MainForm)
Wheight=WindowHeight(#MainForm)
ResizeGadget(#ListFiles, #PB_Ignore, #PB_Ignore , WWidth-10, Wheight-75)
ResizeGadget(#StartStop, (WWidth/2)-35, Wheight-30 , #PB_Ignore, #PB_Ignore)
Case #PB_Event_CloseWindow
End
EndSelect
ForEver