Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Como capturo el tamaño de un directorio (https://www.clubdelphi.com/foros/showthread.php?t=27620)

JOSE NARANJO 25-11-2005 17:03:25

Como capturo el tamaño de un directorio
 
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

Tamaño en disco
 
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:

Código Delphi [-]
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

Cita:

Empezado por JOSE NARANJO
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

Cita:

Empezado por Lepe
El resultado es un Int64.

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

Cita:

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


La franja horaria es GMT +2. Ahora son las 22:25:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi