Récupérer la taille d'un dossier

Résolu
Signaler
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
-
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
-
Bonjour !

Je souhaiterais pouvoir récupérer la taille en nombre de fichiers et en octets d'un dossier sans passer par Findfirst, FindNext et FindClose (car trop lent pour de gros dossiers).

Windows y arrive très rapidement en témoigne ce que l'on voit en faisant Clic droit/Propriétés.

Merci d'avance !

SISI231

8 réponses

Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
hello,

j'ai mis la main sur ça:
http://msdn2.microsoft.com/en-us/library/ms630709.aspx
mais c'est pour du script VB. :-\

sinon, questions stupide:
As-tu essayer de faire une applic console qui te retourne la taille du dossier en utilisant findnext?
As-tu comparer la vitesse de cette applic avec celle de la fenetre propriete de win?
Quel est la différence (pour un très gros dossier)?

sinon, il me semble qu'il n'y a pas de moyen d'avoir directement la taille d'un dossier en NTFS/FAT du à la nature du FS. (rappelons que les dossier n'exisent pas réelement sur ces FS. seulement les fichiers existent.) Mais je ne mettrais pas ma main au feu...

A+

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
Salut,

bon je vais peut être m'attirer les foudres des puristes ... mais bon
je vous la donne quand même ...

Voici donc un exemple d'utilisation du FileSystemObject bien connu  des VB iste

Uses ComObj; { pour CreateOleObject}
{Cette partie sert uniquement à formater le résultat au choix :
  en Octet, KiloOctet, MegaOctet, GigaOctet, TeraOctet
La fonction SizeToStr est largement inspirée d'un Snippet de F0xi :}
http://www.codyx.org/snippet_convertir-nombre-taille-ko-mo-go_60.aspx
Type
  TSizeFormat = (sfByte, sfKByte, sfMByte, sfGByte, sfTByte);

  TSizeData = Record
    Precision : Byte;
    Units     : String[6];
    Value     : Int64;
  End;

function SizeToStr(const Size : int64; SizeFormat : TSizeFormat) : string;
Const
  SizeFormatName : Array[TSizeFormat] Of TSizeData =
  ((Precision:0; Units:'Octets'; Value:$1),
   (Precision:2; Units:'Ko';     Value:$400),
   (Precision:2; Units:'Mo';     Value:$100000),
   (Precision:2; Units:'Go';     Value:$40000000),
   (Precision:2; Units:'To';     Value:$10000000000));
begin
  With SizeFormatName[SizeFormat] do
    Result := Format('%.*n %s', [Precision, Size/Value, Units]);
End ;
<hr size ="2" width= "100%" /> {Voici le code qui se charge de récupérer la taille du dossier "filespec"}
function ShowFolderSize(Const filespec : String): String;
var FSO, F : Variant;
Begin
   FSO : = CreateOleObject('Scripting.FileSystemObject');
   F := FSO.GetFolder(filespec);
   Result := Format('La taille du répertoire >> %s'#13#10'est de : %s',
     [F.Path, SizeToStr(F.Size, sfGByte)]);
   FSO := Unassigned;
   F   := Unassigned;
End ;
<hr size ="2" width= "100%" /> {et son utilisation}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption : = ShowFolderSize('e:\program files');
end;

Voilà rien de plus simple ... il y existe, bien sur, d'autres possibilitées ...
pour les plus curieux il y a la MSDN
 
@+
Cirec

Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
Bonsoir

Sans FindFirst FindNext, FindClose !!! Je ne crois pas que cela soit facilement réalisable.

Ensuite tout dépend de ce que tu veux récupérer :
  la taille des fichiers (taille logique)
  la taille totale occupée (taille physique).

N.B. Et que fais tu, dans les cas suivants :
  les raccourcis : comptabilisés en tant que fichiers appartenant au répertoire ?
  les fichiers compressés : Taille du fichier ou de son contenu ?
  etc...

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Salut !

Je ne vois pas franchement d'autre moyen....

"Windows y arrive très rapidement en témoigne ce que l'on voit en faisant Clic droit/Propriétés."
=> Essaye avec ton dossier Windows ou Program Files, Tu verras, le mien met une bonne minute à tout compabiliser.
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
Tant pis merci quand même je laisse tomber !

SISI231
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
OK Cirec ta solution fonctionne parfaitement (à part qu'il ne faut pas mettre la racine d'un lecteur ni d'antislash après le nom du dossier).

Mais elle n'est pas plus rapide que la bonne vielle méthode Find(First|Next|Close) donc je ne sais pas si elle va intéresser sisi231.
Pour info, elle a mis 5 sec à lister un dossier de 1,8 Go, mais si on l'exécute une deuxième fois avec le même dossier, elle va bien plus vite. Sûrement une histoire de cache quelque part.

A+
Flo
Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
Oui c'est vrai ...
mais je n'ai jamais dit qu'elle était plus rapide qu'un FindFirst/Next

Sinon si tu ouvres le dossier avant avec l'explorer et tu fait "Propriétés"
et ensuite dans l'application Delphi le résultat est également plus rapide

et tu peux même changer de répertoire en cours de route pour y revenir plus tard mais il ne mettrera pas plus de temps pour autant

Donc ... une fois chargé dans la session en cours tous les accès suivant sont beaucoup plus rapide

 
@+
Cirec

Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Oui, ça je l'avais remarqué !
Je m'étais même bidouillé un programme qui se lançait avec windows et qui parcourait justement tous les fichiers de tous les lecteurs. Ca ralentissait beaucoup le démarrage de windows mais après tout allait plus vite (enfin, c'est relatif ...).

Cela dit, je ne m'en sers plus...

A+