Taille d'un répertoire

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Taille d'un répertoire

Message par sospel »

Bonjour !

Je croyais que c'était tout simple, mais apparemment, ca ne l'est pas : connaître la taille d'un répertoire par un mot-clé de PUREBASIC ! C'est-à-dire celle que l'on obtient en faisant un clic "droit" sur un nom de répertoire dans un "explorateur de fichiers" et en demandant les "PROPRIETES".

Est-ce que l'un d'entre-vous aurait une formule magique (en PB ou en D.O.S) ?

Merci d'avance :)
Sospel
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Taille d'un répertoire

Message par Ar-S »

Salut,

Code : Tout sélectionner

Resultat.q = DirectoryEntrySize(#Repertoire)
Il ni a pas de formule magique en prog :)
~~~~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
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Re: Taille d'un répertoire

Message par sospel »

J'ai effectivement utilisé cet ordre : "DirectoryEntrySize(#Repertoire)" mais, d'après la notice, il renvoie la taille des fichiers inclus dans le répertoire, et pas celle du répertoire dans son entier

La notice donne :

Syntaxe

Resultat.q = DirectoryEntrySize(#Repertoire)
Description

Renvoie la taille en octets du fichier courant dans le #Repertoire examiné par les fonctions ExamineDirectory() et NextDirectoryEntry().


Et en fait, il me renvoie " taille = 0" pour le répertoire.

Voici, pour confirmer, un exemple extrait de la notice de PB. Il est dans "ExamineDirectory() " :

Code : Tout sélectionner

OpenConsole()
Directory$ = "f:\reptest\"    
  If ExamineDirectory(0, Directory$, "*.*")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Type$ = " [Fichier] "
      Else
        Type$ = " [Sous-répertoire] "
      EndIf
      PrintN( DirectoryEntryName(0) + Type$ + "- Taille en octet : " + Str(DirectoryEntrySize(0)))
    Wend
    Input()
    FinishDirectory(0)
  EndIf


Et le résultat à la Console :

Jeux [Sous-répertoire] - Taille en octet : 0
FuguesMaths [Sous-répertoire] - Taille en octet : 0
fichier1.txt [Fichier] - Taille en octet : 1017603
fichier2.txt [Fichier] - Taille en octet : 1606404


Où est l'erreur ?

Cordialement
SosPel
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Taille d'un répertoire

Message par Cls »

Pour calculer la taille d'un répertoire et de ses sous - répertoires, il faut faire une fonction récursive qui additionnera la taille de tous les fichiers. Il y a des exemples de fonctions récursives un peu partout sur le forum. ;)
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Re: Taille d'un répertoire

Message par sospel »

@ Cls

Ca, je sais faire ! Mais il ne me semble pas excessivement exigeant de souhaiter avoir un ordre en PB qui virerait sans discuter un répertoire comme sous DOS : rmdir "f:\reptest\" /S /Q . Ca marche très bien...

Sinon, pourquoi ne pas laisser au programmeur le plaisir de programmer lui-même ses fonctions trigonométriques par l'algorithme CORDIC :

http://www.trigofacile.com/maths/trigo/ ... cordic.htm :wink:

Je vais donc utiliser "RUNPROGRAM " avec un ordre DOS ... :(

SosPel
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Taille d'un répertoire

Message par Backup »

sospel a écrit :@ Cls

Ca, je sais faire ! Mais il ne me semble pas excessivement exigeant de souhaiter avoir un ordre en PB qui virerait sans discuter un répertoire comme sous DOS : rmdir "f:\reptest\" /S /Q . Ca marche très bien...

tu demande comment connaitre la taille d'un repertoire
puis apres tu parle de suppression ! :roll:

en purebasic on peut effacer un dossier !
je cite la doc (que tu devrai prendre le temps de consulter)
Syntaxe

Resultat = DeleteDirectory(Repertoire$, Masque$ [, Mode])
Description

Efface le répertoire spécifié. Attention, cette commande est dangereuse et doit être utilisée avec précautions.Si le résultat est 0 le répertoire n'a pu être totalement effacé.

'Masque$' doit être une séquence valide pour le système d'exploitation. Par exemple : "*.*" effacera tous les fichiers du répertoire. "*.exe" n'effacera que les fichiers se terminant par .exe. Par défaut une valeur nulle pour Masque$ efface tous les fichiers.

Le paramètre 'Mode' est facultatif et peut être une combinaison des valeurs suivantes:
#PB_FileSystem_Recursive: Efface le répertoire et tous les sous-répertoires
#PB_FileSystem_Force : Efface également les fichiers protégés (Lecture seule).

OS Supportés TOUS

Sinon, pourquoi ne pas laisser au programmeur le plaisir de programmer lui-même ses fonctions trigonométriques par l'algorithme CORDIC :

http://www.trigofacile.com/maths/trigo/ ... cordic.htm :wink:

Je vais donc utiliser "RUNPROGRAM " avec un ordre DOS ... :(

SosPel

et alors que tu te plaint de ne pas trouver une fonction toute faite en purebasic
tu viens maintenant demander qu'on te laisse faire toi meme tes fonctions trigo

le moins qu'on puisse dire, c'est que tu vis dans la contradiction :wink:


le syndrome typique d'un mec qui a trouvé Purebasic sur le P2P
et qui arrive avec ses gros sabot sur le forum , en critiquant le langage
alors meme qu'il ne prends pas le temps de lire la doc

n'est t'elle pas fourni avec la version pirate ?
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Re: Taille d'un répertoire

Message par sospel »

@ Dobro

1/ "le syndrome typique d'un mec qui a trouvé Purebasic sur le P2P"
Raté ! J'utilise PB version 4.50 dûment achetée ... et je consulte la doc autant qu'il le faut.

2/ "tu viens maintenant demander qu'on te laisse faire toi meme tes fonctions trigo"
Je crains que l'humour au second degré ne soit pas passé ...

3/ "tu demande comment connaitre la taille d'un repertoire puis apres tu parle de suppression !"
Ca n'a rien de contradictoire : je souhaite connaître la place qui sera récupérée sur le DD

Bon, ceci dit, que cette picrochroline polémique ne t'empêche pas de me dire comment récupérer la taille d'un répertoire :)
Compte tenu des remarquables tutos (mais si !) que tu mets en ligne, tu dois bien avoir une idée ?

Cordialement :D
Sospel
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Taille d'un répertoire

Message par Backup »

sospel a écrit :@ Dobro

Ca n'a rien de contradictoire : je souhaite connaître la place qui sera récupérée sur le DD
alors pourquoi n'as tu pas posé cette question ?
de me dire comment récupérer la taille d'un répertoire :)
Cordialement :D
Sospel
la reponse t'a été donné ! en utilisant une procedure récursive !

mais si tu ne veux pas te prendre la tete a la faire

tu install la librairie "Droopy Lib" lien a chercher sur le Forum Anglais

et tu fais

Code : Tout sélectionner

#Directory="C:\Windows\" 
MessageRequester(#Directory,Str(GetDirectorySize(#Directory))+" KB")
pour connaitre la taille du Dossier "\Windows"

voila voila ;)
TO7
Messages : 24
Inscription : mer. 29/avr./2009 13:24

Re: Taille d'un répertoire

Message par TO7 »

Désolé mais je ne connais pas l'auteur :oops:

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:\" 
MessageRequester(#Directory,Str(GetDirectorySize(#Directory))+" Kb") 
 
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Taille d'un répertoire

Message par Cls »

Par contre TO7, ton code utilise les API Windows... :(
Il est possible de le faire directement en PB (donc compatible tous OS).

@sospel : je n'ai pas bien compris le sens de ta réponse... Il faut la programmer ta fonction, pas ajouter un simple "/R" à une fonction DOS.

Seconde chose : avoir une fonction qui calculerait automatiquement la taille d'un répertoire, ça enlève la souplesse d'une fonction codée par le développeur (compter uniquement la taille de certains types fichiers, exclure les fichiers cachés/systèmes, etc.). Il est souvent utile d'adjoindre des filtres dans ce type de recherche. Par ailleurs, la fonction en elle - même est très simple à coder !
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Taille d'un répertoire

Message par gnozal »

Voilà un exemple simple :

Code : Tout sélectionner

Procedure.q DirectorySize(Recursive, Directory.s, FirstTime = #True)
  Protected MyDir, FileName.s
  Static TotalSize.q 
  If FirstTime
    TotalSize = 0
  EndIf
  MyDir = ExamineDirectory(#PB_Any, Directory, "*.*")
  If MyDir
    Repeat
      If NextDirectoryEntry(MyDir) = #False
        Break
      EndIf
      ;
      If Right(Directory, 1) <> "\"
        Directory = Directory + "\"
      EndIf
      FileName = DirectoryEntryName(MyDir)
      If DirectoryEntryType(MyDir) = #PB_DirectoryEntry_Directory And Recursive 
        If FileName <> "." And FileName <> ".."
          DirectorySize(Recursive, Directory + FileName, #False)
        EndIf
      ElseIf DirectoryEntryType(MyDir) = #PB_DirectoryEntry_File
        TotalSize + DirectoryEntrySize(MyDir)
      EndIf
      ;
    ForEver
    FinishDirectory(MyDir)
  EndIf
  ProcedureReturn TotalSize
EndProcedure

Debug DirectorySize(#False, #PB_Compiler_Home)

Debug DirectorySize(#True, #PB_Compiler_Home)
PS : vous parlez tous de DOS, il n'y a pas de DOS dans les systèmes NT (contrairement à Win9x/Me). Il y a une machine virtuelle (NTVDM) en mode console qui émule certaines fonctionnalités de MS-DOS.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Taille d'un répertoire

Message par Backup »

tiens j'avais une version buggé de cette procedure
Merci pour la mise a jour ... ;)
Avatar de l’utilisateur
gildev
Messages : 380
Inscription : mar. 19/juin/2007 10:28
Localisation : Picardie (France)

Re: Taille d'un répertoire

Message par gildev »

Ho ouiiiiiiiiiiiiiiiii!!!!

C'est une procédure hyper méga trop bien ça!!!!

Merci gnozal!!! :D
Répondre