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)
-   -   ¿Función para determinar la capacidad del disco duro? (https://www.clubdelphi.com/foros/showthread.php?t=40373)

Roilo 14-02-2007 17:29:15

¿Función para determinar la capacidad del disco duro?
 
Saludos al Foro.
Resulta que estoy enfrascado en un sistema de reporte para tener controladas las PC de la empresa.
El sistema cuando ejecuta determina la RAM, el tipo de CPU, el nombre de la PC, si tiene torre de CD y si es RW. Sólo me falta que el sistema determine la capacidad del disco duro. Si conocen alguna función, le agradecería que me la enseñaran.
GRACIAS de antemano.

Neftali [Germán.Estévez] 14-02-2007 17:41:22

Revisa la ayuda sobre la función DiskSize en SysUtils.

Roilo 14-02-2007 18:39:21

Mas o menos...
 
DiskSize(0) returns the size in bytes of the specified drive, where 0 = Current, 1 = A, 2 = B, etc.

Esta via no me conviene:
En la empresa hay PC que tienen varias particiones.
Si lo que quiero es determinar la capacidad total del disco duro de la pC tendría que analizar si está particionado!!! y luego sumar DiskSize(0)+DiskSize(3) suponiendo que la otra particion corresponde al Drive 3.
......
No sé si me hago entender.
GRACias de antemanos.

rruz 14-02-2007 22:37:01

Para obtener el tamano fisico de un disco duro debes usar el siguiente codigo de control IOCTL_DISK_GET_DRIVE_GEOMETRY


BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to device
IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode
NULL, // lpInBuffer
0, // nInBufferSize
(LPVOID) lpOutBuffer, // output buffer
(DWORD) nOutBufferSize, // size of output buffer
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);


busca en este link

http://msdn2.microsoft.com/en-us/library/aa365169.aspx


Si tienes problemas para escribir el codigo en Delphi dimelo y te lo posteo.


Saludos

seoane 14-02-2007 22:57:26

Con el permiso de rruz, que tiene razón con su respuesta, aquí puedes encontrar como usar esa función:

http://www.clubdelphi.com/foros/show...99&postcount=9

O para ser mas precisos la cosa quedaría algo así:
Código Delphi [-]
type
  DISK_GEOMETRY = record
    Cylinders: int64;
    MediaType: Integer;
    TracksPerCylinder: DWORD;
    SectorsPerTrack: DWORD;
    BytesPerSector: DWORD;
  end;

const
  IOCTL_DISK_GET_DRIVE_GEOMETRY = 458752;

function GetDiskSize(Drive: Integer): int64;
var
  hDisk: THandle;
  Geometry: DISK_GEOMETRY;
  Returned: DWORD;
begin
  Result:= -1;
  hDisk:= CreateFile(PChar('\\.\Physicaldrive' + IntToStr(Drive)),GENERIC_READ,
    FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  if hDisk <> INVALID_HANDLE_VALUE then
  begin
    FillChar(Geometry,Sizeof(Geometry),0);
    if DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,@Geometry,
      sizeof(Geometry),Returned,nil) then
      with Geometry do
        Result:= Cylinders*TracksPerCylinder*SectorsPerTrack*BytesPerSector;
    CloseHandle(hDisk);
  end;
end;


// Por ejemplo
ShowMessage(IntToStr(GetDiskSize(0)));

O si queremos un listado completo:
Código Delphi [-]
var
  i: integer;
  Str: String;
  Size: int64;
begin
  Str:= '';
  for i:= 0 to 16 do  // Comprobamos un numero razonable de discos
  begin
    Size:= GetDiskSize(i);
    if Size > 0 then
      Str:= Format('Disco %d = %d Bytes' + #13#10,[i,Size]);
  end;
  ShowMessage(Str);
end;

Roilo 15-02-2007 15:24:06

gracias
 
Pude resolver con sus ideas. GRACIAS.:) :p :D ;)

Lepe 15-02-2007 15:52:38

Ya puestos... no te olvides de FormatFileSize para que se acomode la unidad, en KB, MB, GB TB, etc..

Saludos

JoAnCa 23-10-2007 00:16:21

Tambien en lo mismo
 
Cita:

Empezado por Roilo (Mensaje 182637)
Saludos al Foro.
Resulta que estoy enfrascado en un sistema de reporte para tener controladas las PC de la empresa.
El sistema cuando ejecuta determina la RAM, el tipo de CPU, el nombre de la PC, si tiene torre de CD y si es RW. Sólo me falta que el sistema determine la capacidad del disco duro. Si conocen alguna función, le agradecería que me la enseñaran.
GRACIAS de antemano.

Hola Roilo, casualmente yo estoy haciendo lo mismo, y me falta: como obtener la RAM y el tipo de CPU, ya tengo todo lo otro. Me podrias ayudar con el codigo para determinar esos datos que me faltan? :cool:

Roilo 30-12-2008 19:07:30

...para determinar la RAM:
Código Delphi [-]
RAM:=trunc(dwTotalPhys/1048576);
label7.caption := floatToStr(RAM)+' MB De Memoria RAM.';

Para determinar procesador (no estoy satisfecho, pero algo hace)
Código Delphi [-]
with TRegistry.Create do   
 try
     RootKey:= HKEY_LOCAL_MACHINE; // <-- La clave root
     if OpenKey('HARDWARE\DESCRIPTION\System\CentralProcessor\0',FALSE) then
     begin
       if    ReadString('ProcessorNameString')<>'' then
        begin
         label8.Caption :=ReadString('ProcessorNameString');
        closekey;
       end
        else
       label8.Caption := 'CPU sin determinar...';
    end;
  finally
     Free;
   end;


Gracias por colaborar...


La franja horaria es GMT +2. Ahora son las 02:10:00.

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