Taille d'un dossier
Publié : mer. 04/mai/2011 22:13
Salut,
un petit code pour obtenir la taille d'un dossier, rien d'extraordinaire à la base.
J'ai surtout travaillé ce code pour qu'il fonctionne dans un thread avec affichage de la taille du dossier qui évolue avec l'analyse.
Donc on peut lancer et arrêter l'analyse de la taille des dossiers avec 2 boutons.
L'affichage est rafraichit toutes les 200ms pour ne pas pénaliser l'analyse.
si vous avez une bonne idée pour afficher une icône qui tourne pendant l'analyse de la taille du dossier au lieu des "..." et sans passer par un imagegadget qu'on rafraichit avec une nouvelle image toutes les x ms, je suis preneur.
un petit code pour obtenir la taille d'un dossier, rien d'extraordinaire à la base.
J'ai surtout travaillé ce code pour qu'il fonctionne dans un thread avec affichage de la taille du dossier qui évolue avec l'analyse.
Donc on peut lancer et arrêter l'analyse de la taille des dossiers avec 2 boutons.
L'affichage est rafraichit toutes les 200ms pour ne pas pénaliser l'analyse.
si vous avez une bonne idée pour afficher une icône qui tourne pendant l'analyse de la taille du dossier au lieu des "..." et sans passer par un imagegadget qu'on rafraichit avec une nouvelle image toutes les x ms, je suis preneur.
Code : Tout sélectionner
Procedure.s DisplaySize(Taille.q, Unite.l = -1, NbDecimals.l = 0)
; Taille = taille du lecteur
; Unite = unité de la taille, 0 = Octect, 1 = Ko, 2 = Mo, 3 = Go. Si = -1, Le choix de l'unité et du nombre de décimal sera automatique
; NbDecimals = nombre de chiffre après la virgule.
Protected Val.q, Txt.s
If Unite = -1
NbDecimals = 0 : Unite = 0
If Taille >= 1000 : Unite = 1 : NbDecimals = 2 : EndIf
If Taille >= 10000 : Unite = 1 : NbDecimals = 1 : EndIf
If Taille >= 1000000 : Unite = 2 : NbDecimals = 2 : EndIf
If Taille >= 10000000 : Unite = 2 : NbDecimals = 1 : EndIf
If Taille >= 1000000000 : Unite = 3 : NbDecimals = 2 : EndIf
If Taille >= 10000000000 : Unite = 3 : NbDecimals = 1 : EndIf
EndIf
Select Unite
Case 0 : Val = 1 : Txt = " octets"
Case 1 : Val = 1024 : Txt = " Ko"
Case 2 : Val = 1024 * 1024 : Txt = " Mo"
Case 3 : Val = 1024 * 1024 * 1024 : Txt = " Go"
EndSelect
ProcedureReturn StrF(Taille / Val, NbDecimals) + Txt
EndProcedure
Global DirectorySize_Stop.i, DirectorySize.q, FullDirectorySize.q, DirectoryCounter.q, DirectoryFileCounter.q, FullDirectoryCounter.q, FullDirectoryFileCounter.q, DirectorySize_Directory.s, DirectoryProgress.i, FullDirectoryProgress.i
Procedure DirectorySize_Display(Finish = 0)
Static Time.i, ProgressBarDirectory.s, ProgressBarFullDirectory.s
ActualTime = ElapsedMilliseconds()
If Time = 0 Or ActualTime - Time > 200 Or Finish
Time = ActualTime
If DirectoryProgress
Select ProgressBarDirectory
Case ""
ProgressBarDirectory = " ."
Case " ."
ProgressBarDirectory = " .."
Case " .."
ProgressBarDirectory = " ..."
Case " ..."
ProgressBarDirectory = ""
EndSelect
Else
ProgressBarDirectory = ""
EndIf
If FullDirectoryProgress
Select ProgressBarFullDirectory
Case ""
ProgressBarFullDirectory = " ."
Case " ."
ProgressBarFullDirectory = " .."
Case " .."
ProgressBarFullDirectory = " ..."
Case " ..."
ProgressBarFullDirectory = ""
EndSelect
Else
ProgressBarFullDirectory = ""
EndIf
SetGadgetText(10, Str(DirectoryFileCounter) + ProgressBarDirectory)
SetGadgetText(11, Str(DirectoryCounter) + ProgressBarDirectory)
SetGadgetText(12, DisplaySize(DirectorySize) + ProgressBarDirectory)
SetGadgetText(13, Str(FullDirectoryFileCounter) + ProgressBarFullDirectory)
SetGadgetText(14, Str(FullDirectoryCounter) + ProgressBarFullDirectory)
SetGadgetText(15, DisplaySize(FullDirectorySize) + ProgressBarFullDirectory)
EndIf
EndProcedure
Procedure DirectorySize_Search(Directory.s, Index)
Protected SubDirectory.s, FileType.l
If Right(Directory, 1) <> "\"
Directory + "\"
EndIf
If ExamineDirectory(Index, Directory, "")
While NextDirectoryEntry(Index) And DirectorySize_Stop = 0
If DirectoryEntryType(Index) = #PB_DirectoryEntry_File
FullDirectorySize + DirectoryEntrySize(Index)
FullDirectoryFileCounter + 1
DirectorySize_Display()
Else
SubDirectory.s = DirectoryEntryName(Index)
If SubDirectory <> "." And SubDirectory <> ".."
FullDirectoryCounter + 1
DirectorySize_Search(Directory + SubDirectory, Index + 1)
EndIf
EndIf
Wend
FinishDirectory(Index)
EndIf
EndProcedure
Procedure DirectorySize_Thread(Parameter)
Protected Directory.s
Directory = DirectorySize_Directory
If ExamineDirectory(0, Directory, "")
While NextDirectoryEntry(0) And DirectorySize_Stop = 0
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
DirectorySize + DirectoryEntrySize(0)
FullDirectorySize = DirectorySize
DirectoryFileCounter + 1
FullDirectoryFileCounter + 1
DirectorySize_Display()
Else
SubDirectory.s = DirectoryEntryName(0)
If SubDirectory <> "." And SubDirectory <> ".."
DirectoryCounter + 1
FullDirectoryCounter + 1
DirectorySize_Display()
EndIf
EndIf
Wend
FinishDirectory(0)
EndIf
DirectoryProgress = 0
If ExamineDirectory(0, Directory, "")
While NextDirectoryEntry(0) And DirectorySize_Stop = 0
If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
SubDirectory.s = DirectoryEntryName(0)
If SubDirectory <> "." And SubDirectory <> ".."
DirectorySize_Search(Directory + SubDirectory, 1)
EndIf
EndIf
Wend
FinishDirectory(0)
EndIf
FullDirectoryProgress = 0
DirectorySize_Display(1)
DirectorySize_Stop = 2
EndProcedure
Procedure DirectorySize(Directory.s)
DirectorySize_Stop = 0
DirectorySize = 0
FullDirectorySize = 0
DirectoryCounter = 0
DirectoryFileCounter = 0
FullDirectoryCounter = 0
FullDirectoryFileCounter = 0
DirectorySize_Directory = Directory
DirectoryProgress = 1
FullDirectoryProgress = 1
CreateThread(@DirectorySize_Thread(), 0)
EndProcedure
If OpenWindow(0, 0, 0, 512, 512, "Taille d'un dossier", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
x = 4
y = 4
Largeur = 512 - 8
ButtonGadget(1, x, y, Largeur, 24, "Démarrer")
y + 24
ButtonGadget(2, x, y, Largeur, 24, "Arrêter")
DisableGadget(2, 1)
y + 24
TextGadget(#PB_Any, x, y, Largeur, 16, "Nombre de fichier :")
y + 16
TextGadget(10, x, y, Largeur, 16, "")
y + 16
TextGadget(#PB_Any, x, y, Largeur, 16, "Nombre de dossier :")
y + 16
TextGadget(11, x, y, Largeur, 16, "")
y + 16
TextGadget(#PB_Any, x, y, Largeur, 16, "Taille des fichiers :")
y + 16
TextGadget(12, x, y, Largeur, 16, "")
y + 16
TextGadget(#PB_Any, x, y, Largeur, 16, "Nombre de fichier dans le dossier et les sous-dossiers:")
y + 16
TextGadget(13, x, y, Largeur, 16, "")
y + 16
TextGadget(#PB_Any, x, y, Largeur, 16, "Nombre de dossier et sous-dossier :")
y + 16
TextGadget(14, x, y, Largeur, 16, "")
y + 16
TextGadget(#PB_Any, x, y, Largeur, 16, "Taille du dossier :")
y + 16
TextGadget(15, x, y, Largeur, 16, "")
y + 16
Repeat
Event = WaitWindowEvent(100)
If DirectorySize_Stop = 2
DisableGadget(1, 0)
DisableGadget(2, 1)
DirectorySize_Stop = 0
EndIf
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
DisableGadget(1, 1)
DisableGadget(2, 0)
DirectorySize("C:\")
Case 2
DirectorySize_Stop = 1
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf