Taille d'un Répertoire

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Taille d'un Répertoire

Message 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: )
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message 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"
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Avec ta fonction tu es limité à une répertoire ne devant pas dépasser 4Go
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Pourquoi ça ? Limitation du Pure ?
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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:
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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 !
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message 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:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
Répondre