Page 1 sur 1
Taille d'un répertoire
Publié : lun. 14/févr./2011 17:16
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
Re: Taille d'un répertoire
Publié : lun. 14/févr./2011 17:29
par Ar-S
Salut,
Il ni a pas de formule magique en prog

Re: Taille d'un répertoire
Publié : lun. 14/févr./2011 21:31
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
Re: Taille d'un répertoire
Publié : lun. 14/févr./2011 22:05
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.

Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 10:56
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
Je vais donc utiliser "RUNPROGRAM " avec un ordre DOS ...
SosPel
Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 11:17
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 !
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
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
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 ?
Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 11:46
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
Sospel
Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 11:56
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
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

Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 12:10
par TO7
Désolé mais je ne connais pas l'auteur
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")
Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 12:24
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 !
Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 15:54
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.
Re: Taille d'un répertoire
Publié : mar. 15/févr./2011 16:01
par Backup
tiens j'avais une version buggé de cette procedure
Merci pour la mise a jour ...

Re: Taille d'un répertoire
Publié : jeu. 17/févr./2011 21:32
par gildev
Ho ouiiiiiiiiiiiiiiiii!!!!
C'est une procédure hyper méga trop bien ça!!!!
Merci gnozal!!!
