Re: Taille d'un dossier
Publié : mer. 18/mai/2011 14:04
Bin oui ont m'attaque ici alors au lieux de ménèrver, je laisser tomber 

Code : Tout sélectionner
Procedure.s DisplaySize(Size.q, Unit.l = -1, NbDecimals.l = 0)
Enumeration
#DisplaySize_Unit_Octect
#DisplaySize_Unit_Ko
#DisplaySize_Unit_Mo
#DisplaySize_Unit_Go
#DisplaySize_Unit_To
EndEnumeration
; Size = taille
; Unit = 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 Value.q, Text.s
If Unit = -1
If Size >= 10000000000000 : Unit = 4 : NbDecimals = 1
ElseIf Size >= 1000000000000 : Unit = 4 : NbDecimals = 2
ElseIf Size >= 10000000000 : Unit = 3 : NbDecimals = 1
ElseIf Size >= 1000000000 : Unit = 3 : NbDecimals = 2
ElseIf Size >= 10000000 : Unit = 2 : NbDecimals = 1
ElseIf Size >= 1000000 : Unit = 2 : NbDecimals = 2
ElseIf Size >= 10000 : Unit = 1 : NbDecimals = 1
ElseIf Size >= 1000 : Unit = 1 : NbDecimals = 2
ElseIf Size >= 1 : Unit = 0 : NbDecimals = 0
Else
NbDecimals = 0
EndIf
EndIf
Select Unit
Case -1 : Value = 1 : Text = " octet"
Case 0 : Value = 1 : Text = " octets"
Case 1 : Value = 1024 : Text = " Ko"
Case 2 : Value = 1024 * 1024 : Text = " Mo"
Case 3 : Value = 1024 * 1024 * 1024 : Text = " Go"
Case 4 : Value = 1024 * 1024 * 1024 * 1024 : Text = " To"
EndSelect
ProcedureReturn StrD(Size / Value, NbDecimals) + Text
EndProcedure
Procedure.s DisplayName(File.s, CSIDL.l = -1)
Protected FileInfo.SHFILEINFO, Name.s, PIDL.l
If File
CoInitialize_(0)
SHGetFileInfo_(File, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_DISPLAYNAME)
Name = PeekS(@FileInfo\szDisplayName)
CoUninitialize_()
ElseIf CSIDL >= 0
If SHGetSpecialFolderLocation_(0, CSIDL, @PIDL) = 0
SHGetFileInfo_(PIDL, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_PIDL | #SHGFI_DISPLAYNAME)
Name = PeekS(@FileInfo\szDisplayName)
EndIf
EndIf
ProcedureReturn Name
EndProcedure
CompilerIf Defined(GetIconFile, #PB_Function) = 0
#SHIL_SMALL = $1
#SHIL_LARGE = $0
#SHIL_EXTRALARGE = $2
#SHIL_JUMBO = $4
#LOAD_LIBRARY_AS_DATAFILE = 2
DataSection
IID_IImageList:
Data.l $46EB5926
Data.w $582E,$4017
Data.b $9F,$DF,$E8,$99,$8D,$AA,$09,$50
EndDataSection
Structure IMAGELISTDRAWPARAMS
cbSize.l
himl.l
i.l
hdcDst.l
x.l
y.l
cx.l
cy.l
xBitmap.l
yBitmap.l
rgbBk.l
rgbFg.l
fStyle.l
dwRop.l
fState.l
frame.l
crEffect.l
EndStructure
Interface IImageList2 Extends iUnknown
Add(hbmImage, hbmMask, pi)
ReplaceIcon(i, hIcon, pi)
SetOverlayImage(iImage, iOverlay)
Replace(i, hbmImage, hbmMask)
AddMasked(hbmImage, crMask, pi)
Draw(pimldp.IMAGELISTDRAWPARAMS)
Remove(i)
GetIcon(i, flags, picon)
GetImageInfo(i, pImageInfo.IMAGEINFO)
Copy(iDst, punkSrc.IImageList, iSrc, uFlags)
Merge(i1, punk2.IImageList, i2, dx, dy, riid, ppv)
Clone(riid, ppv)
GetImageRect(i, prc.RECT)
GetIconSize(cx, cy)
SetIconSize(cx, cy)
GetImageCount(pi)
SetImageCount(uNewCount)
SetBkColor(clrBk, pclr)
GetBkColor(pclr)
BeginDrag(iTrack, dxHotspot, dyHotspot)
EndDrag()
DragEnter(hwndLock, x, y)
DragLeave(hwndLock)
DragMove(x, y)
SetDragCursorImage(punk.IImageList, iDrag, dxHotspot, dyHotspot)
DragShowNolock(fShow)
GetDragImage(ppt.POINT, pptHotspot.POINT, riid, ppv)
GetItemFlags(i, dwFlags)
GetOverlayImage(iOverlay, piIndex)
EndInterface
Global OS
OS = OSVersion()
Procedure.l GetIconFile(IconFile.s, Size.l) ; Get icon 16*16, 32*32 or 48*48
Protected hIcon.l, FileInfo.SHFILEINFO, dll_Shell32.l, hResult.l, *Guid.l
Select Size
Case #SHIL_SMALL, 16
SHIL = #SHIL_SMALL
Case #SHIL_LARGE, 32
SHIL = #SHIL_LARGE
Case #SHIL_EXTRALARGE, 48
SHIL = #SHIL_EXTRALARGE
Case #SHIL_JUMBO, 128, 256
If OS >= #PB_OS_Windows_Vista
SHIL = #SHIL_JUMBO
Else
SHIL = #SHIL_EXTRALARGE
EndIf
Default
SHIL = #SHIL_SMALL
EndSelect
If OS >= #PB_OS_Windows_XP ; Pour Windows XP et plus, toute taille d'icône
dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
If dll_Shell32
*Guid = ?IID_IImageList
SHGetFileInfo_(IconFile, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX)
hResult = CallFunction(dll_Shell32, "SHGetImageList", SHIL, *Guid, @ImageList.IImageList2)
If hResult = 0
ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon)
ImageList\Release()
EndIf
CloseLibrary(dll_Shell32)
EndIf
Else ; Avant windows XP, icône 16*16 ou 32*32
If SHIL = #SHIL_EXTRALARGE Or SHIL = #SHIL_LARGE
SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
hIcon = InfosFile\hIcon
Else
SHGetFileInfo_(IconFile, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
hIcon = InfosFile\hIcon
EndIf
EndIf
ProcedureReturn hIcon
EndProcedure
Procedure ExtractIconFile(IconFile.s, IconIndex.l, Size.l) ; Extract icon from library or exe
Protected hLibrary, hIcon.l
If IconIndex > 0
hLibrary = LoadLibraryEx_(IconFile, #Null, #LOAD_LIBRARY_AS_DATAFILE)
If hLibrary <> #Null
If IconIndex >> 16
hIcon = LoadImage_(hLibrary, PeekS(IconIndex), #IMAGE_ICON, Size, Size, 0)
Else
hIcon = LoadImage_(hLibrary, IconIndex & $FFFF, #IMAGE_ICON, Size, Size, 0)
EndIf
FreeLibrary_(hLibrary)
EndIf
Else
hIcon = GetIconFile(IconFile, Size)
EndIf
ProcedureReturn hIcon
EndProcedure
CompilerEndIf
Enumeration
#DirectorySize_State_Stop
#DirectorySize_State_Start
#DirectorySize_State_Finish
EndEnumeration
Structure DirectorySizeInformation
Name.s
Size.q
FileCounter.q
HideFileCounter.q
DirectoryCounter.q
HideDirectoryCounter.q
State.i
Icon.i
EndStructure
Global NewList DirectorySize.DirectorySizeInformation()
Global GetDirectorySize_Stop.i, DirectorySize_Directory.s, GetDirectorySize_Gadget.i, DirectorySize_IconSize.i, DirectorySize_IconDetail.i, DirectorySize_Cursor_Wait.i, DirectorySize_Cursor_Normal.i, GetDirectorySize_Running.i
Procedure GetDirectorySize_SubClassProc(hwnd, msg, wparam, lparam)
oldproc = GetProp_(hwnd, "oldproc")
Select msg
Case #WM_NCDESTROY
RemoveProp_(hwnd, "oldproc")
Case #WM_SETCURSOR
If GetDirectorySize_Running
SetCursor_(DirectorySize_Cursor_Wait)
Else
SetCursor_(DirectorySize_Cursor_Normal)
EndIf
ProcedureReturn 0
EndSelect
ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
EndProcedure
Procedure GetDirectorySize_Display(Force = 0)
Static Time.i
Protected *DirectorySize.DirectorySizeInformation, Size.q, FileCounter.q, DirectoryCounter.q, HideFileCounter.q, HideDirectoryCounter.q, Text.s
ActualTime = ElapsedMilliseconds()
If Time = 0 Or ActualTime - Time > 200 Or Force
Time = ActualTime
*DirectorySize = @DirectorySize()
FirstElement(DirectorySize())
If DirectorySize()\State <> #DirectorySize_State_Stop
If DirectorySize()\State = #DirectorySize_State_Finish
DirectorySize()\State = #DirectorySize_State_Stop
EndIf
SetGadgetItemText(GetDirectorySize_Gadget, 1, DisplaySize(DirectorySize()\Size))
If DirectorySize()\FileCounter > 1
Text = "Fichiers : "
Else
Text = "Fichier : "
EndIf
Text + Str(DirectorySize()\FileCounter)
If DirectorySize()\HideFileCounter > 1
Text + " [+" + Str(DirectorySize()\HideFileCounter) + " cachés]"
ElseIf DirectorySize()\HideFileCounter > 0
Text + " [+" + Str(DirectorySize()\HideFileCounter) + " caché]"
EndIf
SetGadgetItemText(GetDirectorySize_Gadget, 2, Text)
If DirectorySize()\DirectoryCounter > 1
Text = "Dossiers : "
Else
Text = "Dossier : "
EndIf
Text + Str(DirectorySize()\DirectoryCounter)
If DirectorySize()\HideDirectoryCounter > 1
Text + " [+" + Str(DirectorySize()\HideDirectoryCounter) + " cachés]"
ElseIf DirectorySize()\HideDirectoryCounter > 0
Text + " [+" + Str(DirectorySize()\HideDirectoryCounter) + " caché]"
EndIf
SetGadgetItemText(GetDirectorySize_Gadget, 3, Text)
EndIf
If ListSize(DirectorySize()) > 1
LastElement(DirectorySize())
If DirectorySize()\State = #DirectorySize_State_Finish
DirectorySize()\State = #DirectorySize_State_Stop
DirectorySize()\Icon = GetIconFile(DirectorySize_Directory + DirectorySize()\Name, 16)
DirectorySize()\Name = DisplayName(DirectorySize_Directory + DirectorySize()\Name)
Index = CountGadgetItems(GetDirectorySize_Gadget)
AddGadgetItem(GetDirectorySize_Gadget, Index, DirectorySize()\Name, DirectorySize()\Icon, 2)
AddGadgetItem(GetDirectorySize_Gadget, Index + 1, DisplaySize(DirectorySize()\Size), DirectorySize_IconSize, 3)
If DirectorySize()\FileCounter > 1
Text = "Fichiers : "
Else
Text = "Fichier : "
EndIf
Text + Str(DirectorySize()\FileCounter)
If DirectorySize()\HideFileCounter > 1
Text + " [+" + Str(DirectorySize()\HideFileCounter) + " cachés]"
ElseIf DirectorySize()\HideFileCounter > 0
Text + " [+" + Str(DirectorySize()\HideFileCounter) + " caché]"
EndIf
AddGadgetItem(GetDirectorySize_Gadget, Index + 2, Text, 0, 3)
If DirectorySize()\DirectoryCounter > 1
Text = "Dossiers : "
Else
Text = "Dossier : "
EndIf
Text + Str(DirectorySize()\DirectoryCounter)
If DirectorySize()\HideDirectoryCounter > 1
Text + " [+" + Str(DirectorySize()\HideDirectoryCounter) + " cachés]"
ElseIf DirectorySize()\HideDirectoryCounter > 0
Text + " [+" + Str(DirectorySize()\HideDirectoryCounter) + " caché]"
EndIf
AddGadgetItem(GetDirectorySize_Gadget, Index + 3, Text, 0, 3)
SetGadgetItemState(GetDirectorySize_Gadget, Index, #PB_Tree_Expanded)
EndIf
ForEach DirectorySize()
Size + DirectorySize()\Size
FileCounter + DirectorySize()\FileCounter
HideFileCounter + DirectorySize()\HideFileCounter
DirectoryCounter + DirectorySize()\DirectoryCounter
HideDirectoryCounter + DirectorySize()\HideDirectoryCounter
Next
SetGadgetItemText(GetDirectorySize_Gadget, 5, DisplaySize(Size))
If FileCounter > 1
Text = "Fichiers : "
Else
Text = "Fichier : "
EndIf
Text + Str(FileCounter)
If HideFileCounter > 1
Text + " [+" + Str(HideFileCounter) + " cachés]"
ElseIf HideFileCounter > 0
Text + " [+" + Str(HideFileCounter) + " caché]"
EndIf
SetGadgetItemText(GetDirectorySize_Gadget, 6, Text)
If DirectoryCounter > 1
Text = "Dossiers : "
Else
Text = "Dossier : "
EndIf
Text + Str(DirectoryCounter)
If HideDirectoryCounter > 1
Text + " [+" + Str(HideDirectoryCounter) + " cachés]"
ElseIf HideDirectoryCounter > 0
Text + " [+" + Str(HideDirectoryCounter) + " caché]"
EndIf
SetGadgetItemText(GetDirectorySize_Gadget, 7, Text)
EndIf
ChangeCurrentElement(DirectorySize(), *DirectorySize)
EndIf
EndProcedure
Procedure GetDirectorySize_Search(Directory.s, Index)
Protected SubDirectory.s, FileType.l
If Right(Directory, 1) <> "\"
Directory + "\"
EndIf
If ExamineDirectory(Index, Directory, "")
While NextDirectoryEntry(Index) And GetDirectorySize_Stop = 0
If DirectoryEntryType(Index) = #PB_DirectoryEntry_File
DirectorySize()\Size + DirectoryEntrySize(Index)
Attributs = DirectoryEntryAttributes(Index)
If Attributs & #PB_FileSystem_Hidden
DirectorySize()\HideFileCounter + 1
Else
DirectorySize()\FileCounter + 1
EndIf
GetDirectorySize_Display()
Else
SubDirectory.s = DirectoryEntryName(Index)
If SubDirectory <> "." And SubDirectory <> ".."
Attributs = DirectoryEntryAttributes(Index)
If Attributs & #PB_FileSystem_Hidden
DirectorySize()\HideDirectoryCounter + 1
Else
DirectorySize()\DirectoryCounter + 1
EndIf
GetDirectorySize_Search(Directory + SubDirectory, Index + 1)
EndIf
EndIf
Wend
FinishDirectory(Index)
EndIf
EndProcedure
Procedure GetDirectorySize_Thread(Parameter)
Protected NewList SubDirectory.s()
GetDirectorySize_Running = 1
If DirectorySize_IconSize = 0
DirectorySize_IconSize = ExtractIconFile("shell32.dll", 275, 16)
EndIf
If DirectorySize_IconDetail = 0
DirectorySize_IconDetail = ExtractIconFile("shell32.dll", 23, 16)
EndIf
If DirectorySize_Cursor_Wait = 0
DirectorySize_Cursor_Wait = LoadCursor_(0, #IDC_APPSTARTING)
EndIf
If DirectorySize_Cursor_Normal = 0
DirectorySize_Cursor_Normal = LoadCursor_(0, #IDC_ARROW)
EndIf
If GetProp_(GadgetID(GetDirectorySize_Gadget), "oldproc") = 0
SetProp_(GadgetID(GetDirectorySize_Gadget), "oldproc", SetWindowLongPtr_(GadgetID(GetDirectorySize_Gadget), #GWL_WNDPROC, @GetDirectorySize_SubClassProc()))
EndIf
SendMessage_(GadgetID(GetDirectorySize_Gadget), #WM_SETCURSOR , 0, 0)
AddElement(DirectorySize())
DirectorySize()\Name = DisplayName(DirectorySize_Directory)
DirectorySize()\Icon = GetIconFile(DirectorySize_Directory, 16)
AddGadgetItem(GetDirectorySize_Gadget, 0, DirectorySize()\Name, DirectorySize()\Icon, 0)
AddGadgetItem(GetDirectorySize_Gadget, 1, DisplaySize(0), DirectorySize_IconSize, 1)
AddGadgetItem(GetDirectorySize_Gadget, 2, "Fichier : ", 0, 1)
AddGadgetItem(GetDirectorySize_Gadget, 3, "Dossier : ", 0, 1)
SetGadgetItemState(GetDirectorySize_Gadget, 0, #PB_Tree_Expanded)
DirectorySize()\State = #DirectorySize_State_Start
GetDirectorySize_Display(1)
If ExamineDirectory(0, DirectorySize_Directory, "")
While NextDirectoryEntry(0) And GetDirectorySize_Stop = 0
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
DirectorySize()\Size + DirectoryEntrySize(0)
Attributs = DirectoryEntryAttributes(0)
If Attributs & #PB_FileSystem_Hidden
DirectorySize()\HideFileCounter + 1
Else
DirectorySize()\FileCounter + 1
EndIf
GetDirectorySize_Display()
Else
SubDirectory.s = DirectoryEntryName(0)
If SubDirectory <> "." And SubDirectory <> ".."
Attributs = DirectoryEntryAttributes(0)
If Attributs & #PB_FileSystem_Hidden
DirectorySize()\HideDirectoryCounter + 1
Else
DirectorySize()\DirectoryCounter + 1
EndIf
AddElement(SubDirectory())
SubDirectory() = SubDirectory
GetDirectorySize_Display()
EndIf
EndIf
Wend
FinishDirectory(0)
EndIf
DirectorySize()\State = #DirectorySize_State_Finish
GetDirectorySize_Display(1)
If ListSize(SubDirectory()) > 0
AddGadgetItem(GetDirectorySize_Gadget, 4, DirectorySize()\Name + " [Dossier + sous-dossier(s)]", DirectorySize()\Icon, 0)
AddGadgetItem(GetDirectorySize_Gadget, 5, DisplaySize(0), DirectorySize_IconSize, 1)
AddGadgetItem(GetDirectorySize_Gadget, 6, "Fichier : ", 0, 1)
AddGadgetItem(GetDirectorySize_Gadget, 7, "Dossier : ", 0, 1)
AddGadgetItem(GetDirectorySize_Gadget, 8, "Détails", DirectorySize_IconDetail, 1)
SetGadgetItemState(GetDirectorySize_Gadget, 4, #PB_Tree_Expanded)
SortList(SubDirectory(), #PB_Sort_Ascending | #PB_Sort_NoCase )
ForEach SubDirectory()
AddElement(DirectorySize())
DirectorySize()\Name = SubDirectory()
DirectorySize()\State = #DirectorySize_State_Start
GetDirectorySize_Search(DirectorySize_Directory + SubDirectory(), 1)
DirectorySize()\State = #DirectorySize_State_Finish
GetDirectorySize_Display(1)
Next
EndIf
GetDirectorySize_Stop = 2
GetDirectorySize_Running = 0
SendMessage_(GadgetID(GetDirectorySize_Gadget), #WM_SETCURSOR , 0, 0)
EndProcedure
Procedure GetDirectorySize(Directory.s)
GetDirectorySize_Stop = 0
If Right(Directory, 1) <> "\"
Directory + "\"
EndIf
DirectorySize_Directory = Directory
ForEach DirectorySize()
If DirectorySize()\Icon
DestroyIcon_(DirectorySize()\Icon)
EndIf
Next
ClearList(DirectorySize())
ClearGadgetItems(GetDirectorySize_Gadget)
CreateThread(@GetDirectorySize_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
GetDirectorySize_Gadget = TreeGadget(#PB_Any, x, y, Largeur, 300, #PB_Tree_AlwaysShowSelection | #PB_Tree_NoLines)
Repeat
Event = WaitWindowEvent(100)
If GetDirectorySize_Stop = 2
DisableGadget(1, 0)
DisableGadget(2, 1)
GetDirectorySize_Stop = 0
EndIf
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
DisableGadget(1, 1)
DisableGadget(2, 0)
Dossier.s = PathRequester("Taille du dossier", "C:\")
If FileSize(Dossier) = -2
GetDirectorySize(Dossier)
EndIf
Case 2
GetDirectorySize_Stop = 1
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Jacobus a écrit :T'as un proco à jambe de bois ou quoi ?! 2min... y doit être suisse.
Le code n'est pas de moi mais de LSI. Je n'ai fais que rajouter une progressbar. En fait là on ne calcule pas QUE la taille d'un dossier.
J'ai retesté, c'est avec le debug qu'il plante. A la fin j'ai le message windows "purebasicX.exe a cessé de fonctionner blablabla"Le Soldat Inconnu a écrit :Je n'arrive pas a reproduire, aucun bug chez moi ...