Taille total des fichier trouvé [Résolu]

SystemWin - 2 juin 2013 à 08:12 - Dernière réponse :  SystemWin
- 3 juin 2013 à 06:55
Bonjour a tous,

BEGIN

Comment optenir la taille totale des fichiers trouvé ?



// Conversion
Function SizeToStr( Size : Int64 ) : string;
begin
    if Size >= $10000000000 then
      Result := Format('%.2f  To', [Size / $10000000000])
    else if Size >= $40000000 then
      Result := Format('%.2f  Go', [Size / $40000000])
    else if Size >= $100000 then
      Result := Format('%.2f  Mo', [Size / $100000])
    else if Size >= $400 then
      Result := Format('%.2f  Ko', [Size / $400] )
    else
      Result := Format('%d  Octets', [Size] );
end;

// Recherche fichier
Function RechFile(Root, Extension: String; Item: TListItem; List: TListview) : String;
var
  Rec: TSearchRec;
  ToSize : Int64; // <--- 
begin
  ToSize := 0; // <--- ( MON PROBLEME )
  Root := IncludeTrailingPathDelimiter(Root);
  Application.ProcessMessages;
  if FindFirst(Root + Extension, faAnyFile - faDirectory, Rec) = 0 then
    try
      repeat
      Item := List.Items.Add;
       with Item do
        begin
        Caption :=  (Root); // Chemin
        SubItems.Add (Rec.Name); // Nom du fichier
        ToSize := ToSize + Rec.Size; // <--- ( Addition ) 
        SubItems.Add(SizeToStr(Rec.Size)); // Taille du fichier
        end;
      until FindNext(Rec) <> 0;
    finally
      FindClose(Rec);
    end;
  if FindFirst(Root + '*.*', faDirectory, Rec) = 0 then
    try
      repeat
        if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
          (Rec.Name <> '..') then
          RechFile(Root + Rec.Name, Extension, Item,List);
      until FindNext(Rec) <> 0;
    finally 
      FindClose(Rec);
    end;
  Result := SizeToStr(ToSize); // <--- ( Conversion ) 
end;

// List2 = Liste des extensions
//  *.ini
//  *.pas
//  *.txt
//  ...

procedure TForm1.Button1Click(Sender: TObject);
var
 Item1: TListItem;
 I : Integer;
begin // List2 = Liste des extensions
  for I := 0 to List2.Items.Count -1 do
    if List2.Items[I].Checked = true then
     begin
       ToSize.Caption := RechFile('C:\',List2.Items[I].Caption,Item1,List1);
     end;
end;


Merci de votre réponse.

End;
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 2 juin 2013 à 20:01
3
Merci
ToSize := 0; // <--- ( MON PROBLEME )


Tu as effectivement bien localisé le problème, puisque tu réinitalises ToSize à 0 chaque fois que tu passes par là. Et la fonction étant récursive...

Merci korgis 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de korgis
Meilleure réponse
3
Merci
function SizeToStr( Size : Int64 ) : string;
begin
    if Size >= $10000000000 then
      Result := Format('%.2f  To', [Size / $10000000000])
    else if Size >= $40000000 then
      Result := Format('%.2f  Go', [Size / $40000000])
    else if Size >= $100000 then
      Result := Format('%.2f  Mo', [Size / $100000])
    else if Size >= $400 then
      Result := Format('%.2f  Ko', [Size / $400] )
    else
      Result := Format('%d  Octets', [Size] );
end;


// Recherche fichier
procedure ScanFile(Root,Extension: String; Item: TListItem; List: TListview; var ToSize: Int64);
var
  Rec: TSearchRec;
begin
  Root := IncludeTrailingPathDelimiter(Root);
  Application.ProcessMessages;
  if FindFirst(Root + Extension, faAnyFile - faDirectory, Rec) = 0 then
    try
      repeat
      Item := List.Items.Add;
       with Item do
        begin
        List.SmallImages := form1.ImageList1;
        Caption :=  (Root);
        SubItems.Add (Rec.Name);
        inc(ToSize,Rec.Size);
        SubItems.Add(SizeToStr(Rec.Size));
        end;
      until FindNext(Rec) <> 0;
      SendMessage(List.Handle,WM_VSCROLL,SB_BOTTOM,0);
    finally
      FindClose(Rec);
    end;
  if FindFirst(Root + '*.*', faDirectory, Rec) = 0 then
    try
      repeat
        if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
          (Rec.Name <> '..') then
          ScanFile(Root + Rec.Name, Extension, Item,List,ToSize);
      until FindNext(Rec) <> 0;
    finally
      FindClose(Rec);
    end;
   form1.Label2.Caption := (SizeToStr(ToSize));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Item: TListItem;
 I: Integer;
 l : Int64;
begin
 l := 0;
  List1.Clear;
  for I := 0 to List2.Items.Count -1 do
    if List2.Items[I].Checked = true then
     begin
       ScanFile('C:\',List2.Items[I].Caption,Item,List1,l);
     end;
end;

Merci SystemWin 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de SystemWin

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.