Taille d'un dossier

Partagez votre expérience de PureBasic avec les autres utilisateurs.
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Taille d'un dossier

Message par dayvid »

Bin oui ont m'attaque ici alors au lieux de ménèrver, je laisser tomber :mrgreen:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Mindphazer
Messages : 695
Inscription : mer. 24/août/2005 10:42

Re: Taille d'un dossier

Message par Mindphazer »

Personne ne t'attaque.
On t'a simplement dit que s'il y avait un domaine dans lequel tu devrais la mettre en veilleuse, c'est l'orthographe.
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Taille d'un dossier

Message par graph100 »

Pour ma part, avec le code de Jacobus qui compte avant de chercher la taille, pour un dossier de 695 775 Fichiers, 22 591 Dossiers (environ 100Go), le premier comptage prend 2min environ
en temps qu'utilisateur, je trouve ça assez long !
Ensuite, effectivement, le phénomène de cache ramène le temps à 10 sec. Cependant, je ne pense pas qu'il faille compter la dessus, si on regarde la taille d'un dossier, c'est justement qu'on ne la connais pas ;)

pour info : DD 7200tr/min
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Taille d'un dossier

Message par Jacobus »

T'as un proco à jambe de bois ou quoi ?! 2min 8O ... 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.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Taille d'un dossier

Message par Le Soldat Inconnu »

Idem chez moi, sur un portable avec 30go de données sous C, il faut bien 40s de scan pour le comptage et 5 secondes pour le calcul. Après, avec le phénomène de cache, ça va plus vite 2s de comptage et 5 secondes de calcul.

C'est la raison pour la laquelle je n'ai pas mis de barre de progression
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Taille d'un dossier

Message par Ar-S »

Ah ce moment peut-être faudrait il mettre un thread faisant apparaitre une barre de progression allant de 1 à x en boucle jusqu'à la fin du listage, cela prendrait peut-être moins de temps.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Taille d'un dossier

Message par Le Soldat Inconnu »

Nouvelle version :
- J'ai inclus les morceaux de ma librairie GetIcon pour que tous le monde puisse avoir les icônes
- Je change le curseur de la souris pendant l'analyse pour montrer que le programme travaille

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

Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Taille d'un dossier

Message par Ar-S »

Bonne idée,
par contre, je lance en mod debug, le comptage se fait, le curseur change, mais dès qu'il a terminé le listage, je vois une ligne rouge apparaitre dans le debug puis le programme se ferme, pas le temps de lire le message.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Taille d'un dossier

Message par Le Soldat Inconnu »

Je n'arrive pas a reproduire, aucun bug chez moi ...
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Taille d'un dossier

Message par graph100 »

Jacobus a écrit :T'as un proco à jambe de bois ou quoi ?! 2min 8O ... 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.
:mrgreen: :mrgreen: naah ! il est pas suisse :mrgreen:
Mais il est normal que compter autant de fichiers prenne autant de temps ! (Et puis c'est pas le processeur qui est en cause là ! C'est plutôt le disque dur.
Windows met carrément le même temps que le code de LSI pour fournir l'affichage des propriétés !

Pour info mon proc :
Intel(R) Core(TM)2 Duo CPU T9300 @ 2.50Ghz 2.50GHz
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Taille d'un dossier

Message par dayvid »

Bin c'est pas si mal déjà :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Taille d'un dossier

Message par Ar-S »

Le Soldat Inconnu a écrit :Je n'arrive pas a reproduire, aucun bug chez moi ...
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"
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Taille d'un dossier

Message par Le Soldat Inconnu »

En pB x64 ou x32 ?

Moi je suis en x32 et ça ne plante pas avec le debugger
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Taille d'un dossier

Message par Ar-S »

En PB x32 pourtant
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre