Je te propose ce code qui ne copie pas de fichiers. Il s'agit d'une lecture récursive d'un dossier et ses sous-dossiers.
J'ai limité la lecture des fichiers à 5000 fichiers.
Clique sur le bouton OnOff pour activer ou désactiver la lecture.
A compiler avec l'option de compilation Thread activé. Si tu ne le fais pas, tu auras un message te demandant de le faire.
Code : Tout sélectionner
Enumeration Window
#mf
EndEnumeration
Enumeration Gadget
#mfOnOff
#mfListFolder
#mfCountFiles
#mfProgress
EndEnumeration
;Déclaration des variables
Global OnOff.b ;Interupteur OnOff (#True, #False)
Global CountFiles.i ;Compteur de fichiers
Global Thread
;Plan application
Declare Start()
Declare OnOff()
Declare StartThread(*Value)
Declare.s ParseDirectory(folder.s, id.l = 0)
Declare Resize()
Declare Exit()
CompilerIf Not #PB_Compiler_Thread
CompilerError "L'option activer la gestion des thread doit etre activer!"
CompilerEndIf
;Appel de la procédure Start
Start()
;Affichage de l'application
Procedure Start()
OpenWindow(#mf, 0, 0, 400, 320,"Lecture d'un dossier(Thread)",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
WindowBounds(#mf, 300, 320, #PB_Ignore, #PB_Ignore)
TextGadget(#PB_Any, 5, 10, 120, 20, "Nombre de fichiers lus")
TextGadget(#mfCountFiles, 130, 10, 80, 20, "0", #PB_Text_Right)
ListIconGadget(#mfListFolder, 5, 30, 390,250, "Dossier", 200)
AddGadgetColumn(#mfListFolder, 1, "Fichiers",200)
ProgressBarGadget(#mfProgress, 5, 290, 200, 24, 0, 100)
HideGadget(#mfProgress, #True)
ButtonGadget(#mfOnOff, 325, 290, 70, 24, "On/Off")
;Gestion des evenements
BindGadgetEvent(#mfOnOff, @OnOff()) ;Si clique sur le bouton OnOff, appel de la procedure OnOff
BindEvent(#PB_Event_SizeWindow, @Resize()) ;Redimentionner les gadgets de la fenêtre
BindEvent(#PB_Event_CloseWindow, @Exit()) ;Si fermeture alors appel à la procedure Exit()
Repeat : WaitWindowEvent(10) : ForEver
EndProcedure
;Procédure appelée quand on clique sur le bouton OnOff
Procedure OnOff()
If OnOff = #False
ClearGadgetItems(#mfListFolder)
CountFiles=0
OnOff = #True
HideGadget(#mfProgress, #False)
Thread = CreateThread(@StartThread(), 0)
Else
OnOff = #False
HideGadget(#mfProgress, #True)
EndIf
EndProcedure
Procedure StartThread(*Value)
;On lance la lecture des fichiers
ParseDirectory(GetEnvironmentVariable("USERPROFILE"))
;Une boucle d'attente quand que la variable OnOff reste à #True
While OnOff = #True : Wend
EndProcedure
;Parcourir un dossier (Fonction recurssive by Flype il me semble)
Procedure.s ParseDirectory(folder.s, id.l = 0)
Static Progress
If Right(folder, 1) <> "\"
folder + "\"
EndIf
If ExamineDirectory(id, folder, "*.*")
While NextDirectoryEntry(id) And OnOff = #True
If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".."
AddGadgetItem(#mfListFolder,-1, folder + Chr(10) + DirectoryEntryName(id))
;Affichage du coompteur de fichiers
CountFiles + 1
SetGadgetText(#mfCountFiles, Str(CountFiles))
;Mettre à jour le ProgressBar (Inutile de le créer à nouveau)
If CountFiles >= 5000
OnOff()
EndIf
;Mettre à jour le ProgressBar
Progress + 1
If Progress = 1001
Progress = 0
EndIf
SetGadgetState(#mfProgress, Progress/10)
If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
ParseDirectory(folder + DirectoryEntryName(id), id + 1)
EndIf
EndIf
Wend
FinishDirectory(id)
EndIf
EndProcedure
Procedure Resize()
Protected WWidth=WindowWidth(#mf)
Protected Wheight=WindowHeight(#mf)
ResizeGadget(#mfListFolder, #PB_Ignore, #PB_Ignore , WWidth-10, Wheight-75)
ResizeGadget(#mfProgress, #PB_Ignore, Wheight-30 , #PB_Ignore, #PB_Ignore)
ResizeGadget(#mfOnOff, WWidth - 75, Wheight-30 , #PB_Ignore, #PB_Ignore)
EndProcedure
Procedure Exit()
If IsThread(Thread)
KillThread(Thread)
EndIf
End
EndProcedure