Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fonction (API) qui donne instantanément la taille d'un dossier

22 réponses
Avatar
Guy FALESSE
Bonjour à tous,

Je n'ai trouvé à ce sujet, ce qui ne veut rien dire :-(
Existerait-il une fonction (API) qui donnerait instantanément la taille d'un
dossier.
D'avance merci.

Guy FALESSE

10 réponses

1 2 3
Avatar
Guy FALESSE
Salut Andre,

Merci pour ta réponse, mais justement c'était justement d'éviter d'employer
fso :-)
@+

Guy FALESS


"andre.araste" a écrit dans le message de news:
4280dcf2$0$847$
La taille d'un dossier.
Oui, c'est possible. Il faut utiliser le modèle objet FileSystemObject qui
est une classe nouvelle de Visual Basic 6 - On peut utiliser un tel objet
pour effectuer la plupart des opérations que l'on pouvait faire avec les
mots clés traditionnels du langage. Les méthodes de haut niveau de
FileSystemObject retournent d'autres types d'objets : File, Folder, Drive
et TextStream, chacun d'eux possédant ses propres méthodes et propriétés.
Ce système représente une meilleure solution pour organiser toutes les
possibilités de gestion interactive des fichiers, il se trouve dans la
runtime scrrun.dll et doit être lié à un projet VB6 par une référence
d'objet avant de pouvoir fonctionner.

La syntaxe est complexe et exige une certaine habitude.

La méthode GetFolder renseigne sur un dossier avec une double hiérarchie.
Elle retourne un objet dérivant Dossier de type Folder qui lui-même
retourne un objet Fichiers de type Files

' GetFolder
Set Dossier = fso.GetFolder(Chemin)
Set Fichiers = Dossier.Files
fso.FolderExists(Chemin) ' oui ou non
Dossier.Size ' retourne la dim du dossier

C'est à creuser et ça marche mais on ne peut pas dire que ça donne
instantanément la taille d'un dossier, il y quelques lignes de codes en
perspective !
--
Bonne réception.

http://perso.wanadoo.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.



"Guy FALESSE" a écrit dans le message de news:

Bonjour à tous,

Je n'ai trouvé à ce sujet, ce qui ne veut rien dire :-(
Existerait-il une fonction (API) qui donnerait instantanément la taille
d'un dossier.
D'avance merci.

Guy FALESSE






Avatar
Fred
Dans son message uz$
scraper nous dit :

Bonjour Zoury, dans le message
news:
tu disais :


Il faut utiliser le modèle objet FileSystemObject qui
est une classe nouvelle de Visual Basic 6 -



Si tu optes pour cette option, je te suggères de lire la mise en
garde concernant le FSO :
http://faq.vb.free.fr/index.php?question6



yes ....

il est surprenant (après essais) que la méthode fso donne presque
instantanément le résultat pour un dossier volumineux, avec sous
dossiers, alors que l'API mouline bien plus longtemps ??

au fait, si j'utilise (par exemple, et pour une appli en local) la
méthode fso, y a t il une solution pour que le résultat retourné
donne la taille des fichiers contenus dans le dossier, à l'exception
des sous dossiers ?
merci



Bonsoir Scraper,
Je viens faire un p'tit tour sur vb :-)
Si dans ton post tu fais allusion au code de cette page :
http://support.microsoft.com/kb/185601/en-us
alors, ce n'est pas du pur FSO d'où peut-être la rapidité.
En fait le FSO n'est utilisé que pour récupérer la liste des répertoires et
pour une fonction BuildPath que je n'avais jamais utilisée d'ailleurs.
Tout le reste (et le plus important je pense) fait appel aux fonction VB
(Dir, FileLen, etc)

Pour ce qui est de ta seconde question, il te suffit de supprimer :
8<-------------
If fld.SubFolders.Count > 0 Then
For Each tFld In fld.SubFolders
DoEvents
FindFile = FindFile + FindFile(tFld.Path, sFile, nDirs, nFiles)
Next
End If
8<------------
Et ton code n'iras plus dans les sous dossiers.

Si tu ne faisais pas allusion à cette page, eh bien tu as quand même la
réponse à ta deuxième question.


--
Fred
Avatar
scraper
Bonjour Fred, dans le message
news:
tu disais :

> Bonsoir Scraper,
Je viens faire un p'tit tour sur vb :-)
Si dans ton post tu fais allusion au code de cette page :
http://support.microsoft.com/kb/185601/en-us
alors, ce n'est pas du pur FSO d'où peut-être la rapidité.



euh ... non !
(damned !)
basiquement :

Dim fso As New FileSystemObject
Dim d As Object
Set d = fso.GetFolder(MyFolder)

En fait le FSO n'est utilisé que pour récupérer la liste des
répertoires et pour une fonction BuildPath que je n'avais jamais
utilisée d'ailleurs. Tout le reste (et le plus important je pense)
fait appel aux fonction VB (Dir, FileLen, etc)



je vais aller voir
(je suis conditionné par la rapidité d'exécution .... y compris sur une
arborescence complète de dossiers (TreeView) ;-)

Pour ce qui est de ta seconde question, il te suffit de supprimer :
8<-------------
If fld.SubFolders.Count > 0 Then
For Each tFld In fld.SubFolders
DoEvents
FindFile = FindFile + FindFile(tFld.Path, sFile, nDirs,
nFiles) Next
End If
8<------------
Et ton code n'iras plus dans les sous dossiers.

Si tu ne faisais pas allusion à cette page, eh bien tu as quand même
la réponse à ta deuxième question.



oui ! lol

je te remercie, je vais étudier ça (demain )...

je te tiendrai au courant

merci

à +



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Fred
Dans le message:,
scraper écrit :
Bonjour Fred, dans le message
news:
tu disais :

Bonsoir Scraper,
Je viens faire un p'tit tour sur vb :-)
Si dans ton post tu fais allusion au code de cette page :
http://support.microsoft.com/kb/185601/en-us
alors, ce n'est pas du pur FSO d'où peut-être la rapidité.



euh ... non !
(damned !)
basiquement :

Dim fso As New FileSystemObject
Dim d As Object
Set d = fso.GetFolder(MyFolder)

En fait le FSO n'est utilisé que pour récupérer la liste des
répertoires et pour une fonction BuildPath que je n'avais jamais
utilisée d'ailleurs. Tout le reste (et le plus important je pense)
fait appel aux fonction VB (Dir, FileLen, etc)



je vais aller voir
(je suis conditionné par la rapidité d'exécution .... y compris sur
une arborescence complète de dossiers (TreeView) ;-)

Pour ce qui est de ta seconde question, il te suffit de supprimer :
8<-------------
If fld.SubFolders.Count > 0 Then
For Each tFld In fld.SubFolders
DoEvents
FindFile = FindFile + FindFile(tFld.Path, sFile, nDirs,
nFiles) Next
End If
8<------------
Et ton code n'iras plus dans les sous dossiers.

Si tu ne faisais pas allusion à cette page, eh bien tu as quand même
la réponse à ta deuxième question.



oui ! lol

je te remercie, je vais étudier ça (demain )...

je te tiendrai au courant

merci

à +



J'ai compris.
Tu fais appel à la propriété Size de l'objet Folder !
J'étais toujours dans l'optique des appels récursifs pour énumérer le
contenu d'une arborescence.
Dans ce cas la page à laquelle je faisais référence ne t'est d'aucune
utilité (c'était un lien sur la page proposée par Zoury d'où ma confusion)
Size n'est pas paramétrable, elle renvoie toujours la taille totale pour un
dossier.
Pas d'autre solution, je pense, que de parcourir la collection de fichiers
renvoyée par la propriété "Files".
Mes plus plates excuses pour cette intervention saugrenue ;-)

--
Fred
Avatar
scraper
Bonjour Fred, dans le message
news:
tu disais :

J'ai compris.
Tu fais appel à la propriété Size de l'objet Folder !
J'étais toujours dans l'optique des appels récursifs pour énumérer le
contenu d'une arborescence.
Dans ce cas la page à laquelle je faisais référence ne t'est d'aucune
utilité (c'était un lien sur la page proposée par Zoury d'où ma
confusion) Size n'est pas paramétrable, elle renvoie toujours la
taille totale pour un dossier.
Pas d'autre solution, je pense, que de parcourir la collection de
fichiers renvoyée par la propriété "Files".
Mes plus plates excuses pour cette intervention saugrenue ;-)



il n'y a aucun problème ! :-)

comme souvent dans ce genre de situation, en prenant la situation sous un
angle complètement différent, le problème se résout :-)

j'ai modifié mon code de façon à utiliser pleinement le résultat donné par
Set d = fso.GetFolder(MyFolder)
sSize) =d.Size

:-)


et je n'ai plus de problème lol

merci de ton intervention

par contre, une chose que je ne m'explique pas est la différence très
significative entre le temps mis pour retourner le résultat sous fso, et en
utilisant d'autres méthodes ??

la question que je me pose est : n'y aurait il pas moyen de récupérer
directement (si ça existe ?) dans une propriété quelconque du dossier qui
m'intéresse, sa taille ?

en d'autres termes, la taille d'un dossier n'est elle pas sotockée quelque
part ?

merci :-)



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Fred
Dans le message:,
scraper écrit :
Bonjour Fred, dans le message
news:
tu disais :

J'ai compris.
Tu fais appel à la propriété Size de l'objet Folder !
J'étais toujours dans l'optique des appels récursifs pour énumérer le
contenu d'une arborescence.
Dans ce cas la page à laquelle je faisais référence ne t'est d'aucune
utilité (c'était un lien sur la page proposée par Zoury d'où ma
confusion) Size n'est pas paramétrable, elle renvoie toujours la
taille totale pour un dossier.
Pas d'autre solution, je pense, que de parcourir la collection de
fichiers renvoyée par la propriété "Files".
Mes plus plates excuses pour cette intervention saugrenue ;-)



il n'y a aucun problème ! :-)

comme souvent dans ce genre de situation, en prenant la situation
sous un angle complètement différent, le problème se résout :-)

j'ai modifié mon code de façon à utiliser pleinement le résultat
donné par Set d = fso.GetFolder(MyFolder)
sSize) =d.Size

:-)


et je n'ai plus de problème lol

merci de ton intervention

par contre, une chose que je ne m'explique pas est la différence très
significative entre le temps mis pour retourner le résultat sous fso,
et en utilisant d'autres méthodes ??

la question que je me pose est : n'y aurait il pas moyen de récupérer
directement (si ça existe ?) dans une propriété quelconque du dossier
qui m'intéresse, sa taille ?

en d'autres termes, la taille d'un dossier n'est elle pas sotockée
quelque part ?

merci :-)



Bonjour,
En descendant aussi bas que je le peux, c'est-à-dire au niveau des API
Windows voila ce que je trouve concernant la gestion des répertoires :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/directory_management_functions.asp
Rien au sujet d'un calcul de taille. Ce qui me paraît naturel, car cela
impliquerait une redondance d'informations.
Pour les fichiers j'obtiens ceci :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/directory_management_functions.asp
C'est un peu plus fourni et on retrouve en particulier les fonctions
utilisées par le Dir du VB (ça me rappelle le bon vieux DOS quand il fallait
faire appel aux interruptions (21h ?) pour lister un répertoire
(FindFirstFile, FindNextFile).

Donc je ne pense pas que l'information au sujet de la taille d'un répertoire
soit stockée dans le système de fichiers. Par contre, il est vrai qu'au
niveau du Shell, si on demande deux fois la taille d'un dossier, la deuxième
fois est instantanée car il doit y avoir mémorisation de l'information (à
creuser)

Quand tu parles de différence de temps d'exécution entre le FSO et d'autres
méthodes, à quoi penses-tu ?
Pour moi faire appel au fso en VB doit être plus lent car il y a une couche
intermédiaire entre le programme VB et les APIs. Mais cela doit dépendre des
fonctions. Pour le size d'un dossier cela me paraît logique que le FSO soit
plus rapide que de programmer une énumération des sous-dossiers en VB. Le
code du FSO doit être optimisé alors que le code VB par défaut ajoute des
informations de déboggage et de contrôle. Il faut voir ce que cela donne en
version finale peut-être ?



--
Fred
Avatar
scraper
Bonjour Fred, dans le message
news:
tu disais :

Bonjour,
En descendant aussi bas que je le peux, c'est-à-dire au niveau des API
Windows voila ce que je trouve concernant la gestion des répertoires :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/directory_management_functions.asp
Rien au sujet d'un calcul de taille. Ce qui me paraît naturel, car
cela impliquerait une redondance d'informations.
Pour les fichiers j'obtiens ceci :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/directory_management_functions.asp
C'est un peu plus fourni et on retrouve en particulier les fonctions
utilisées par le Dir du VB (ça me rappelle le bon vieux DOS quand il
fallait faire appel aux interruptions (21h ?) pour lister un
répertoire (FindFirstFile, FindNextFile).



hemm .... c'est le même lien ;-)

Donc je ne pense pas que l'information au sujet de la taille d'un
répertoire soit stockée dans le système de fichiers. Par contre, il
est vrai qu'au niveau du Shell, si on demande deux fois la taille
d'un dossier, la deuxième fois est instantanée car il doit y avoir
mémorisation de l'information (à creuser)



oui, mais ça ne conviendra pas : il n'y aura pas de 2° passage ;-)

Quand tu parles de différence de temps d'exécution entre le FSO et
d'autres méthodes, à quoi penses-tu ?



ben par exemple en utilisant FindFirstFilEx etc , de façon récursive, pour
obtenir le poids total du répertoire, y compris les sous dossiers ;-)
si le répertoire est conséquent, avec de nombreux sous dossiers, ça peut
être très long ....

sinon, en ne cherchant que les fichiers dans le répertoire (sans s'occuper
des sous dossiers, donc), en faisant un Dir$ sur le répertoire, et en
additionnant les tailles de fichiers avec GetFileSizeEx sur chaque fichier
(cas d'un répertoire avec de nombreux fichiers ...)

dans les 2 cas, fso est bien plus rapide ?? (et pourtant, il fournit la
taille totale, compris les sous dossiers)

bon, j'ai pas mesuré avec exactitude, mais ça va de quelques secondes à
quelques dizaines de secondes, dans les cas extrêmes !

bien, tant pis, c'était juste pour essayer de faire ça proprement dans
passer par le fso ...
en l'état actuel des choses, et bien que ça ne m'enchante guère, je vais
rester à cette solution ;-)



merci en tout cas de ton aide, et du temps que tu y as passé ;-)



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Alain CROS
Bonjour.

Je n'ai que Win98 et ne peut donc pas tester mais ...

Obtaining a Handle to a Directory
To obtain a handle to a directory, call the CreateFile function with the FILE_FLAG_BACKUP_SEMANTICS flag as demonstrated in the
following example:



hDir = CreateFile (
DirName,
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);

You can pass a directory handle to the following functions:


BackupRead
BackupSeek
BackupWrite
GetFileInformationByHandle
GetFileSize <--- Peut être ici
GetFileTime
GetFileType
ReadDirectoryChangesW
SetFileTime

Alain CROS





"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de news: u#
Salut Guy ! :O)

Pour obtenir la taille d'un dossier, il faut calculer le total de la taille
des fichiers qu'il contient. Il n'y a ni fonction ni API qui le font
directement...

Regarde cet article pour exemple employant les APIs :

Obtaining the Directory Size, Recursive
http://vbnet.mvps.org/code/fileapi/getdirectorysize.htm

--
Cordialement
Yanick
MVP pour Visual Basic

"Guy FALESSE" a écrit dans le message de
news:
> Bonjour à tous,
>
> Je n'ai trouvé à ce sujet, ce qui ne veut rien dire :-(
> Existerait-il une fonction (API) qui donnerait instantanément la taille
d'un
> dossier.
> D'avance merci.
>
> Guy FALESSE
>
>
>
>




Avatar
Fred
Dans son message
scraper nous dit :

Bonsoir,

Bonjour Fred, dans le message
news:
tu disais :

Bonjour,
En descendant aussi bas que je le peux, c'est-à-dire au niveau des
API Windows voila ce que je trouve concernant la gestion des
répertoires :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/directory_management_functions.asp
Rien au sujet d'un calcul de taille. Ce qui me paraît naturel, car
cela impliquerait une redondance d'informations. Pour les fichiers
j'obtiens ceci :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/directory_management_functions.asp
C'est un peu plus fourni et on retrouve en particulier les fonctions
utilisées par le Dir du VB (ça me rappelle le bon vieux DOS quand il
fallait faire appel aux interruptions (21h ?) pour lister un
répertoire (FindFirstFile, FindNextFile).



hemm .... c'est le même lien ;-)



C'était pour voir si tu suivais (je prends les noms, attention) ;-)
Un "couper" raté sans doute.


Donc je ne pense pas que l'information au sujet de la taille d'un
répertoire soit stockée dans le système de fichiers. Par contre, il
est vrai qu'au niveau du Shell, si on demande deux fois la taille
d'un dossier, la deuxième fois est instantanée car il doit y avoir
mémorisation de l'information (à creuser)



oui, mais ça ne conviendra pas : il n'y aura pas de 2° passage ;-)

Quand tu parles de différence de temps d'exécution entre le FSO et
d'autres méthodes, à quoi penses-tu ?



ben par exemple en utilisant FindFirstFilEx etc , de façon récursive,
pour obtenir le poids total du répertoire, y compris les sous
dossiers ;-) si le répertoire est conséquent, avec de nombreux sous
dossiers, ça
peut être très long ....

sinon, en ne cherchant que les fichiers dans le répertoire (sans
s'occuper des sous dossiers, donc), en faisant un Dir$ sur le
répertoire, et en additionnant les tailles de fichiers avec
GetFileSizeEx sur chaque fichier (cas d'un répertoire avec de
nombreux fichiers ...)
dans les 2 cas, fso est bien plus rapide ?? (et pourtant, il fournit
la taille totale, compris les sous dossiers)

bon, j'ai pas mesuré avec exactitude, mais ça va de quelques secondes
à quelques dizaines de secondes, dans les cas extrêmes !



Dans le second cas (qui t'intéresse si j'ai bien suivi) c'est plus lent même
en compilant de façon optimisée et en exécutant hors de l'IDE ?
Damned. J'en perd mon Latin ;-)

bien, tant pis, c'était juste pour essayer de faire ça proprement dans
passer par le fso ...
en l'état actuel des choses, et bien que ça ne m'enchante guère, je
vais rester à cette solution ;-)



merci en tout cas de ton aide, et du temps que tu y as passé ;-)



De rien (vraiment !)

Bonne soirée.

--
Fred
Avatar
scraper
Bonjour Alain CROS, dans le message
news:
tu disais :


Bonjour.

Je n'ai que Win98 et ne peut donc pas tester mais ...

Obtaining a Handle to a Directory
To obtain a handle to a directory, call the CreateFile function with
the FILE_FLAG_BACKUP_SEMANTICS flag as demonstrated in the following
example:




j'ai essayé, ça fonctionne pas :-(

merci quand même ....



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
1 2 3