ディスク容量とメモリ容量の取得

メモ。ディスク容量とメモリ容量の取得。Delphi2009で動作確認。
いまさらですが。

SysStats.pas

unit SysStats;

interface

uses
  Windows, SysUtils;

type
  TDiskSpace = record
    Directory: string;
    FreeAvailable: UInt64;
    TotalSpace: UInt64;
    TotalFree: UInt64;
  end;

function GetMemoryStatus: TMemoryStatusEx;
function GetAvailableMemory(Phy: Boolean = True): UInt64;
function GetTotalMemory(Phy: Boolean = True): UInt64;
function GetDiskSpace(Directory: string): TDiskSpace;
function GetAvailableDiskSpace(Directory: string): UInt64;
function GetTotalDiskSpace(Directory: string): UInt64;

implementation

function GetMemoryStatus: TMemoryStatusEx;
begin
  Result.dwLength := SizeOf(TMemoryStatusEx);
  GlobalMemoryStatusEx(Result);
end;

function GetAvailableMemory(Phy: Boolean = True): UInt64;
begin
  if Phy then
    Result := GetMemoryStatus.ullAvailPhys
  else
    Result := GetMemoryStatus.ullAvailVirtual;
end;

function GetTotalMemory(Phy: Boolean = True): UInt64;
begin
  if Phy then
    Result := GetMemoryStatus.ullTotalPhys
  else
    Result := GetMemoryStatus.ullTotalVirtual;
end;

function GetDiskSpace(Directory: string): TDiskSpace;
var
  FreeAvailable, TotalSpace, TotalFree: TLargeInteger;
begin
  GetDiskFreeSpaceEx(PChar(Directory), FreeAvailable, TotalSpace, @TotalFree);

  Result.Directory := Directory;
  Result.FreeAvailable := FreeAvailable;
  Result.TotalSpace := TotalSpace;
  Result.TotalFree := TotalFree;
end;

function GetAvailableDiskSpace(Directory: string): UInt64;
begin
  Result := GetDiskSpace(Directory).FreeAvailable;
end;

function GetTotalDiskSpace(Directory: string): UInt64;
begin
  Result := GetDiskSpace(Directory).TotalSpace;
end;

end.

Project1.dpr

使用例

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  SysStats in '..\..\lib\SysStats.pas';

begin
  try
    Writeln('mem avail(Phy):', GetAvailableMemory);
    Writeln('mem avail(Virtual):', GetAvailableMemory(False));
    Writeln('mem total(Phy):', GetTotalMemory);
    Writeln('mem total(Virtual):', GetTotalMemory(False));
    Writeln('disk C:\ avail:', GetAvailableDiskSpace('C:\'));
    Writeln('disk C:\ total:', GetTotalDiskSpace('C:\'));
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

実行結果

>Project1.exe
mem avail(Phy):2388979712
mem avail(Virtual):2129387520
mem total(Phy):3489107968
mem total(Virtual):2147352576
disk C:\ avail:148713963520
disk C:\ total:209966686208