sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 2013
-
22 juil. 2007 à 14:51
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 2008
-
27 juil. 2007 à 14:16
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.
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.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 27 juil. 2007 à 13:52
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
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 22 juil. 2007 à 19:13
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
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 23 juil. 2007 à 11:36
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 27 juil. 2007 à 14:02
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.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 27 juil. 2007 à 14:16
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 ...).