Page 1 sur 1

Taille d'un Répertoire

Publié : dim. 23/oct./2005 15:14
par Droopy
Ce code renvoie la taille d'un répertoire, en Ko.

Il supporte les fichiers de + de 4Go

Code : Tout sélectionner

;/ Return Size of a Directory ( in Kb )

Procedure SearchDirectorySize(Path.s)
  
  ; Add \ to Path if missing
  If Right(Path,1)<>"\" : Path+"\":EndIf
  
  ; Apply Structure
  lpFindFileData.WIN32_FIND_DATA
  
  ; Add Filter *.*
  Recherche.s=Path+"*.*"
  
  ; Initiate the Search
  handle.l = FindFirstFile_(Recherche, @lpFindFileData)
  
  ; If search succeeds
  If handle <> #INVALID_HANDLE_VALUE
    
    Repeat
      
      ; Trouve = File or Directory Found
      Trouve.s=PeekS(@lpFindFileData\cFileName)
      
      ; This is a not a directory
      If lpFindFileData\dwFileAttributes & #FILE_ATTRIBUTE_DIRECTORY =#False
        
        Fichiers.s=Path+Trouve
        
        Size+( lpFindFileData\nFileSizeLow / 1024) ; Add Low DWord
        If lpFindFileData\nFileSizeHigh
          Size+lpFindFileData\nFileSizeHigh * $3FFFFF ; Add High DWord *$3FFFFF
        EndIf
        
      EndIf
      
      ; Exit when there is no more files
    Until FindNextFile_(handle, @lpFindFileData)= #False
    
    ; Close the Api search Function
    FindClose_(handle)
    
  EndIf

  ProcedureReturn Size
  
EndProcedure
  
Procedure SearchSubDirectorySize(Path.s)
  
  ; Add \ to Path if missing
  If Right(Path,1)<>"\" : Path+"\":EndIf
  
  ; Apply Structure
  lpFindFileData.WIN32_FIND_DATA
  
  ; Add Filter *.*
  Recherche.s=Path+"*.*"
  
  ; Initiate the Search
  handle.l = FindFirstFile_(Recherche, @lpFindFileData)
  
  ; If search succeeds
  If handle <> #INVALID_HANDLE_VALUE
    
    Repeat
      
      ; trouve = File Or Directory Found
      Trouve.s=PeekS(@lpFindFileData\cFileName)
      
      ; This is a directory
      If lpFindFileData\dwFileAttributes & #FILE_ATTRIBUTE_DIRECTORY
        
        ; And not the . or .. directory
        If Trouve <>"." And Trouve <>".."
          
          ; Call the function itself ( Recursive ) to search in another Directory
          Size+SearchSubDirectorySize(Path+Trouve)
          
          ; Directory found : Search file within this Directory
          Size+ SearchDirectorySize(Path+Trouve)
          
        EndIf
        
      EndIf
      
      ; Exit when there is no more files
    Until FindNextFile_(handle, @lpFindFileData)= #False
    
    ; Close the Api search Function
    FindClose_(handle)
    
  EndIf

  ProcedureReturn Size
  
EndProcedure

ProcedureDLL GetDirectorySize(Path.s) 
  
  Size=SearchDirectorySize(Path) ; Car le répertoire lui même n'est pas scanné sinon
  Size+SearchSubDirectorySize(Path)
  
  ProcedureReturn Size
  
EndProcedure

;/ Test
#Directory="c:\Windows\"
MessageRequester(#Directory,Str(GetDirectorySize(#Directory))+" Kb")
( J'espère ne pas avoir utilisé de Lib sinon je vais encore me faire engueuler ! :lol: )

Publié : dim. 23/oct./2005 19:15
par Heis Spiter
Y a tellement plus simple et plus portable

Code : Tout sélectionner

Procedure GetDirSize(ID, NomRepertoire$, Mode)
  
  If Right(NomRepertoire$, 1) <> "\" : NomRepertoire$ = NomRepertoire$ + "\" : EndIf
  If ExamineDirectory(ID, NomRepertoire$, "*.*")
    NextD = NextDirectoryEntry()
    While NextD
      If DirectoryEntryName() <> "." And DirectoryEntryName() <> ".."
        If NextD = 2 And Mode = 1
          TSize = TSize+GetDirSize(ID+1, NomRepertoire$+DirectoryEntryName(), 1)
        ElseIf NextD = 1
          TSize = TSize+DirectoryEntrySize()
        EndIf
      EndIf
      UseDirectory(ID)
      NextD = NextDirectoryEntry()
    Wend
  EndIf
  ProcedureReturn TSize
  
EndProcedure
; Mode 1, le répertoire et les sous répertoires.
Debug Str(GetDirSize(1, "X:\XXX\", 1)/1024)+"Ko"
; Mode 0, le répertoire sans les sous répertoires.
Debug Str(GetDirSize(1, "X:\XXX\", 0)/1024)+"Ko"

Publié : dim. 23/oct./2005 19:31
par Droopy
Avec ta fonction tu es limité à une répertoire ne devant pas dépasser 4Go

Publié : dim. 23/oct./2005 22:18
par Heis Spiter
Pourquoi ça ? Limitation du Pure ?

Publié : dim. 23/oct./2005 22:37
par nico
Heis, peut être que ton code est plus limité que celui de Droopy pour l'instant mais avec la version 4, tu l'emporteras! :lol:

Publié : lun. 24/oct./2005 8:45
par Droopy
La valeur max des Long est : 4294967295
Filesize renvoie maximum 4294967295

Un répertoire devra contenir moins de 4294967295 octets


Effectivement avec la version 4, son code est meilleur !

Publié : lun. 24/oct./2005 8:52
par Heis Spiter
Ah oui... C'est pareil qu'avec l'uptime quoi !

Ceci dit, je viens de voir, ton code a un problème aussi ! Le même que le mien :). Puisque Windows renvoie tout en Kb... Et que toi même dans ton code, tu fais la division par 1024 pour avoir en Kb...
Donc, ça ne change absolument rien...:roll:

Publié : lun. 24/oct./2005 10:01
par Droopy
L'API renvoie la taille du fichier dans deux Long (Hi et Lo)

L'API renvoie des octets, c'est pour cela que je divise Long(lo) par 1024 afin d'avoir des octets

Je multiplie Long(Hi) par $3FFFFF afin d'ajouter la partie haute de la taille du fichier .


Ce qui permet de ne plus être limité à des taille de fichiers / taille de répertoire > à 4Go