PDA

Ver la Versión Completa : ¿Función para determinar la capacidad del disco duro?


Roilo
14-02-2007, 17:29:15
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
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/showpost.php?p=149899&postcount=9

O para ser mas precisos la cosa quedaría algo así:

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:

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
Pude resolver con sus ideas. GRACIAS.:) :p :D ;)

Lepe
15-02-2007, 15:52:38
Ya puestos... no te olvides de FormatFileSize (http://www.clubdelphi.com/trucos/index.php?id=39)para que se acomode la unidad, en KB, MB, GB TB, etc..

Saludos

JoAnCa
23-10-2007, 00:16:21
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:

RAM:=trunc(dwTotalPhys/1048576);
label7.caption := floatToStr(RAM)+' MB De Memoria RAM.';


Para determinar procesador (no estoy satisfecho, pero algo hace)

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...