Get size of a disk directory  

Send By: Radikal (Q3 Team)
Web : http://www.q3.nu
Email: radikal@q3.nu
Date: 10/04/03

Tip accessed 514 times

 



 procedure TForm1.Button1Click(Sender: TObject);

   function GetDirectorySize(const ADirectory: string): Integer;
   var
     Dir:  TSearchRec;
     Ret:  integer;
     Path: string;
   begin
     Result := 0;
     Path   := ExtractFilePath(ADirectory);
     Ret    := Sysutils.FindFirst(ADirectory, faAnyFile, Dir);

     if Ret <> NO_ERROR then
       exit;

     try
       while ret=NO_ERROR do
       begin
         inc(Result, Dir.Size);
         if (Dir.Attr in [faDirectory]) and (Dir.Name[1] <> '.') then
            Inc(Result, GetDirectorySize(Path + Dir.Name + '\*.*'));
         Ret := Sysutils.FindNext(Dir);
       end;
     finally
       Sysutils.FindClose(Dir);
     end;
   end;


 begin
   Caption:=IntToStr( GetDirectorySize('c:\delphi3') );
 end;




Sent by: José Antonio García Navarro (enetesystems@wanadoo.es)

Starting from this tip, I have created one new in the one that the function returns in size of the directory, the number of directories that contains and the number of files that contains that directory.
For it, it is necessary to define the following type:

 type
   rDirInfo = record
     Tamano         : Int64;
     NumDirectorios : Integer;
     NumArchivos    : Integer;
   end;



The function is the following:


 {Función que devuelve diversa información sobre un directorio.
  Tamaño, Numero de Ficheros y Número de Directorios.}
 function InfoDirectorio(Directorio : String ) : rDirInfo;
 var
   Archivo   : tSearchRec;  // Archivo o carpeta con el que se trabaja en cada momento.
   Retorno   : Integer;     // Valor de retorno de las Funciones FindFirst y FindNext.
   Path      : String;      // Path del archivo.
   InfoTemp  : rDirInfo;    // Registro con la Información temporal del directorio.
   InfoTemp2 : rDirInfo;    // Registro con la Información temporal del directorio que devuelve la función.
 begin
   // Inicialización de las variables.
   InfoTemp.Tamano := 0;
   InfoTemp.NumDirectorios := 0;
   InfoTemp.NumArchivos := 0;

   // Si se introduce un nombre de directorio acabado en '\' se le quita,
   // ya que si no no funciona Finfirst y findnext.
   if Directorio[Length(Directorio)] = '\' then
     Directorio := Copy(Directorio, 1, Length(Directorio)-1);

   Path    := ExtractFilePath(Directorio);

   Retorno := FindFirst(Directorio, faAnyFile, Archivo);

   if Retorno = NO_ERROR then
   begin
     try
       while Retorno = NO_ERROR do
       begin
         Inc(InfoTemp.Tamano, Archivo.Size); // Se incrementa el tamaño en bytes del fichero/directorio.
         // Si es un directorio y no es el '.' o '..'.
         if ((Archivo.Attr and faDirectory) = faDirectory) and (Archivo.Name[1] <> '.') then
         begin
           // Se busca la información del directorio.
           InfoTemp2 := InfoDirectorio(Path + Archivo.Name + '\*.*');
           // Se suman los datos devueltos en el registro temporal.
           Inc(InfoTemp.Tamano, InfoTemp2.Tamano);
           Inc(InfoTemp.NumDirectorios, InfoTemp2.NumDirectorios+1);
           Inc(InfoTemp.NumArchivos, InfoTemp2.NumArchivos);
         end
         else
           // Si es un archivo.
           if Archivo.Name[1] <> '.' then
             Inc(InfoTemp.NumArchivos);  // Se incrementa en 1 el número de archivos.
         // Se busca el siguiente archivo.
         Retorno := FindNext(Archivo);
       end;
     finally
       // Se libera la memoria.
       FindClose(Archivo);
     end;
   end;
   Result := InfoTemp;
 end;




Call example:


 procedure tForm1.bInfoDirectorioClick(Sender: TObject);
 var
   InformDirectorio : rDirInfo;
 begin
   InformDirectorio := InfoDirectorio(eDirectorio.Text);
   eTamano.Text := IntToStr(InformDirectorio.Tamano);
   eNumDirectorios.Text := IntToStr(InformDirectorio.NumDirectorios);
   eNumArchivos.Text := IntToStr(InformDirectorio.NumArchivos);
 end;




Sent byr: (Neftalí) Germán Estévez (Neftali@mx3.redestb.es)
You can calculate the size of a folder and his descendants recusively using this function (it use FindData of the object TSearchRec of the finded files).
Go with the code:

 function FolderSize(fld: string): dword;
   var
     sr: tsearchrec;
     r: integer;
     s: dword;
   begin
     fld := includetrailingbackslash(fld);
     s := 0;
     r := findfirst((fld + '*.*'), faanyfile, sr);
     while (r = 0) do
     begin
       application.processmessages;
       if ((sr.attr and fadirectory) <> 0) then
       begin
         if ((sr.name <> '.') and (sr.name <> '..')) then
           s := s + foldersize(fld + sr.name);
       end
       else
         S := S + SR.FindData.nFileSizeLow;
       r := findnext(sr);
     end;
     sysutils.findclose(sr);
     result := s;
   end;






Updated at 10/04/2003 (Neftalí code)