Ir al contenido


Foto

Encontrar el tamaño de un disco con varias particiones


  • Por favor identifícate para responder
No hay respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 junio 2012 - 05:39

Con motivo de mi respuesta en CD en este tema, publico el truco también en DA.

Se trata de un ejemplo para calcular el tamaño de un disco físico, con particiones o no,  sabiendo una unidad de volumen. La filosofía se basa en encontrar el número de disco físico a partir de una letra de unidad para luego explorar las unidades activas y ver si pertenecen al disco físico previamente conocido. El resto es sumar.

Este método puede contar algo de menos espacio que puede estar perdido en sectores no usados. En realidad el verdadero espacio disponible para el usuario después de formatear una unidad es menor que el nominal.


delphi
  1. uses
  2.   Windows, SysUtils;
  3.  
  4. const
  5.   IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = $00560000;
  6.  
  7. function GetPhysicalDrive(Volume: Char): integer;
  8. var
  9.   hFile: THandle;
  10.   Vde: array [0..56] of BYTE;
  11.   BytesReturned: Cardinal;
  12. begin
  13.   Volume:= char((ord(Volume) or 32)-32);
  14.   Result:= -1;
  15.   hFile:= CreateFile(PAnsiChar('\\.\' + Volume + ':'),0,0,nil, OPEN_EXISTING, 0, 0);
  16.   if hFile <> INVALID_HANDLE_VALUE then
  17.   begin
  18.     if DeviceIoControl(hFile, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, nil, 0, @Vde, SizeOf(Vde), BytesReturned, nil) then
  19.       Result:= PBYTE(DWORD(@Vde)+8)^;
  20.     CloseHandle(hFile);
  21.   end;
  22. end;
  23.  
  24. function GetDriveSizeFromVol(D: char): UINT64;
  25. var
  26.   LD: DWORD;
  27.   Ch: char;
  28.   Disk: DWORD;
  29. begin
  30.   Result:= 0;
  31.   Disk:= GetPhysicalDrive(D);
  32.   LD:= GetLogicalDrives();
  33.   Ch:= 'A';
  34.   while LD <>0 do
  35.   begin
  36.     if ((LD and $1) = 1) and (GetPhysicalDrive(Ch) = Disk) then
  37.       Inc(Result, DiskSize(Ord(Ch) - Ord('A') + 1));
  38.     LD:= LD shr 1;
  39.     inc(Ch);
  40.   end;
  41. end;


Un ejemplo de uso:

delphi
  1. var
  2.   TotalSize: UINT64;
  3. begin
  4.   TotalSize:= GetDriveSizeFromVol('c');
  5.   Writeln(TotalSize);
  6.   ReadLn;
  7. end.

Esta probado en WinXP y Win7 64bits.



Saludos.
  • 0




IP.Board spam blocked by CleanTalk.