PDA

Ver la Versión Completa : Como capturo el tamaño de un directorio


JOSE NARANJO
25-11-2005, 17:03:25
Quisiera saber como capturo el tamaño de un directorio.

roman
25-11-2005, 17:08:09
¿Qué entiendes por tamaño de un directorio? Porque podemos estar hablando de la longitud de su nombre o de los archivos que contiene.

// Saludos

JOSE NARANJO
25-11-2005, 20:18:00
Me refiero al tamaño en disco que tiene el directorio, incluyendo los subdirectorios y archivos. Ejemplo quiero saber cuanto tamaño (kb,Gb) tiene el directorio c:\windows

jhonny
25-11-2005, 23:41:41
Segun el truco 351 de trucomania es asi:


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;


Si lo asignas a Caption como esta en la funcion aprecera en la barra de titulo del formulario.

Nota: Por favor no vuelvas a repetir hilos.
espero te sirva ;).

jhonny
25-11-2005, 23:48:31
He movido este hilo a API de Windows porque Windows no era la mejor ubicación para una pregunta como esta.

JOSE NARANJO
28-11-2005, 17:05:26
Hola:

Disculpen por colocar dos hilos. Muchas gracias por la rutina me esta funcionando muy bien. Lo unico es que hay que hacer una anotación.

Cuando hay directorios con tamaño que un Integer no soporta tiene problemas. dir.Size es de tipo Integer, hay que tenerlo en cuenta.

gracias

roman
28-11-2005, 17:22:09
Cuando hay directorios con tamaño que un Integer no soporta tiene problemas. dir.Size es de tipo Integer, hay que tenerlo en cuenta.


Algo que supongo puede hacerse es moldear Dir.Size a Cardinal con lo que podrías leer por lo menos el doble de tamaño.

Otra cosa es que el tipo TSearchRec tiene un campo FindData que es un record tal como lo define la API de Windows. Ahí encontrarás que hay dos campos de tipo DWord para el tamaño del archivo, nFileSizeHigh y nFileSizeLow con los que, en conjunto, podrías leer enteros hasta de 64 bits. Dado que FindFirst y FindNext usan las rutinas correspondientes de la API, FindFirstFile y FindNextFile, es de suponerse que ahí encontrarás el valor correcto.

// Saludos

Lepe
29-11-2005, 18:17:44
en concreto, el tamaño exacto es:

nFileSizeHigh * MAXDWORD + nFileSizeLow;

PD: MAXDWORD es una constante de sysutils. El resultado es un Int64.

saludos

roman
29-11-2005, 20:30:04
El resultado es un Int64.


Tengo mis dudas al respecto. La ayuda de Delphi en el tema de operadores dice:


The following rules apply to arithmetic operators.

The value of x/y is of type Extended, regardless of the types of x and y. For other arithmetic operators, the result is of type Extended whenever at least one operand is a real; otherwise, the result is of type Int64 when at least one operand is of type Int64; otherwise, the result is of type Integer. If an operand's type is a subrange of an integer type, it is treated as if it were of the integer type.


En la fórmula

nFileSizeHigh * MAXDWORD + nFileSizeLow

todos los operandos son integer así que creo que cae en el caso señalado. Supongo, sin probarlo, que tendría que ser algo como:

Int64(nFileSizeHigh) * MAXDWORD + nFileSizeLow

// Saludos

Lepe
30-11-2005, 17:47:33
Como has visto mi mensaje era bastante escueto, solo presentaba la fórmula, que no es nada obvio deducirla; el resto son detalles, que dicho sea de paso quedan aclarados por tí ;)

saludos