La manera más simple es en realidad usar GetDiskFreeSpaceEx
del archivo sysutils.pas
.
Hay 2 partes en este ejemplo. la 1ra es la parte importante usando GetDiskFreeSpaceEX
.
function DriveSpace(DriveLetter : String; var FreeSpace, UsedSpace, TotalSpace : int64) : Boolean;
begin
Result := SysUtils.GetDiskFreeSpaceEx(Pchar(DriveLetter), UsedSpace, TotalSpace, @FreeSpace);
if UsedSpace > 0 then
UsedSpace := TotalSpace - FreeSpace;
if not Result then
begin
UsedSpace := 0;
TotalSpace := 0;
FreeSpace := 0;
end;
end;
Si va a solicitar unidades que ya conoce la letra de la unidad como C: eso es todo lo que necesita.
uso sería algo así como:
var
FS,
US,
TS : Int64
begin
DriveSpace('C:', FS, US, TS);
//Do something with the 3 variables.
end;
Dicho esto, si usted quiere encontrar las unidades, así que podría utilizar algo como esto:
procedure ListDrivesOfType(DriveType : Integer; var Drives : TStringList);
var
DriveMap,
dMask : DWORD;
dRoot : String;
I : Integer;
begin
dRoot := 'A:\'; //' // work around highlighting
DriveMap := GetLogicalDrives;
dMask := 1;
for I := 0 to 32 do
begin
if (dMask and DriveMap) <> 0 then
if GetDriveType(PChar(dRoot)) = DriveType then
begin
Drives.Add(dRoot[1] + ':');
end;
dMask := dMask shl 1;
Inc(dRoot[1]);
end;
end;
Nota entero DriveType, debe ser uno de los siguientes:
DRIVE_UNKNOWN = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;
DRIVE_CDROM = 5;
DRIVE_RAMDISK = 6;
(He tomado estos directamente de windows.pas
)
Ahora, finalmente, a responder a su pregunta (y esto es muy áspero) lo siguiente sería añadir información en una nota (llamado memo1) para todos FIXED HARD DRIVES
:
Procedure TAform.SomeNameICantThinkOfNow;
const
BytesPerMB = 1048576;
var
MyDrives : TStringlist;
I : Integer;
FreeSpace,
UsedSpace,
TotalSpace : int64;
begin
MyDrives := TStringlist.Create;
ListDrivesOfType(DRIVE_FIXED, MyDrives);
Memo1.Lines.Clear;
for I := 0 to MyDrives.Count - 1 do
begin
FreeSpace := 0;
UsedSpace := 0;
TotalSpace := 0;
if DriveSpace(MyDrives.Strings[I], FreeSpace, UsedSpace, TotalSpace) then
begin
FreeSpace := FreeSpace div BytesPerMB;
UsedSpace := UsedSpace div BytesPerMB;
TotalSpace := TotalSpace div BytesPerMB;
Memo1.Lines.Add('Drive: ' + MyDrives.Strings[I] + ' = Free Space :' + IntToStr(FreeSpace) +
' Used Space: ' + IntToStr(UsedSpace) + ' Total Space: ' + IntToStr(TotalSpace));
end;
end;
end;
Yo he dicho que lo haría ser desagradable! Acabo de ejecutar esto en el IDE y funciona, lo he hecho como MB, pero realmente debería convertirlo a Double y elegir su formateo si lo hace como MB para ser más preciso ya que el ejemplo que he creado arriba, por supuesto, simplemente redondeará .
Espero que esto sea de poca ayuda.
Lo siento mucho, busqué antes de publicar, pero no vi la otra publicación. ¿Debo eliminar mi pregunta? – DelphiDelver
Eso está bien. It * is * no es fácil buscar duplicados. Creo que puedes dejar tu pregunta aquí (además, no creo que incluso * puedas * eliminarla desde que se publicó una respuesta). Además, de esta manera será más fácil encontrar este tema en SO en el futuro, porque entonces hay dos preguntas con una redacción ligeramente diferente. –
No debe preocuparse por eliminarlo, y en una nota muy egoísta, estoy contento, ya que aceptó la respuesta, mientras que el póster original no. Así es la vida. – Reallyethical