Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Информация о дисках

01.01.2007

Часть информации о диске можно получить при помощи функции GetVolumeInformation. Она позволяет узнать метку, тип файловой системы, серийный номер, максимальную длину имен файлов, а также несколько параметров, связанных с регистром букв в именах файлов, сжатием информации и др.

Для определения типа диска используется функция GetDriveType. Для определения объема диска и свободного пространства - GetDiskFreeSpaceEx. Для определения размера кластера и сектора можно использовать GetDiskFreeSpace. Здесь это не используется.

procedure TForm1.Button1Click(Sender: TObject);
const
  Flags: array [0..5] of cardinal = (
    FS_CASE_IS_PRESERVED,
    FS_CASE_SENSITIVE,
    FS_UNICODE_STORED_ON_DISK,
    FS_PERSISTENT_ACLS,
    FS_FILE_COMPRESSION,
    FS_VOL_IS_COMPRESSED);
 
var
  c: char;
  s: string;
  li: TListItem;
  DriveType: integer;
  bufLabel, bufFileSystem: array [0..1027] of char;
  SerialNumber, MaxFileNameLength, FileSystemFlags: cardinal;
  i: integer;
  freeavalilable, totalspace, totalfree: int64;
 
  procedure AddSpace(value: int64);
  const onfiltered= 1024; onfiltered= 1024 * OneKB; onfiltered= 1024 * OneMB;
  var
    b, kb, mb, gb: integer;
    v: int64;
    s: string;
  begin
    gb := value div OneGb;
    v := value mod OneGb;
    mb := v div OneMb;
    v := v mod OneMb;
    kb := v div OneKb;
    b := v mod OneKb;
    if gb > 0
      then s := IntToStr(gb) + ' gb'
      else s := '';
    if mb > 0 then s := s + ' ' + IntToStr(mb) + ' mb';
    if kb > 0 then s := s + ' ' + IntToStr(kb) + ' kb';
    if b > 0 then s := s + ' ' + IntToStr(b) + ' b';
    if s = '' then s := '0';
    li.SubItems.Add(s);
  end;
 
begin
  ListView1.Items.BeginUpdate;
  ListView1.Items.Clear;
 
  for c := 'A' to 'Z' do begin
    s := c + ':';
    DriveType := GetDriveType(PChar(s));
    if DriveType = 1 then continue;
 
    li := ListView1.Items.Add;
    li.Caption := s;
    case DriveType of
      0: li.SubItems.Add('unknown');
      DRIVE_REMOVABLE: li.SubItems.Add('removable');
      DRIVE_FIXED: li.SubItems.Add('fixed');
      DRIVE_REMOTE: li.SubItems.Add('remote');
      DRIVE_CDROM: li.SubItems.Add('cdrom');
      DRIVE_RAMDISK: li.SubItems.Add('ramdisk');
    end;
    if not GetVolumeInformation(PChar(s), bufLabel, sizeof(bufLabel),
      addr(SerialNumber), MaxFileNameLength, FileSystemFlags,
      bufFileSystem, sizeof(bufFileSystem)) then continue;
    li.SubItems.Add(bufLabel);
    li.SubItems.Add(bufFileSystem);
    li.SubItems.Add(IntToStr(SerialNumber));
    li.SubItems.Add(IntToStr(MaxFileNameLength));
 
    for i := low(flags) to high(flags) do
      if (FileSystemFlags and flags[i]) <> 0
        then li.SubItems.Add('yes')
        else li.SubItems.Add('no');
 
    GetDiskFreeSpaceEx(PChar(s), freeavalilable, totalspace, @totalfree);
    AddSpace(freeavalilable);
    AddSpace(totalspace);
    AddSpace(totalfree);
  end;
  ListView1.Items.EndUpdate;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
const
  FlagStrs: array [0..5] of string = (
    'Case preserved',
    'Case sensitive',
    'Unicode',
    'Preserve ACLs',
    'File Compression',
    'Volume Compression');
 
  procedure AddColumn(caption: string);
  var
    lc: TListColumn;
  begin
    lc := ListView1.Columns.Add;
    lc.Caption := caption;
    lc.Width := ColumnHeaderWidth;
  end;
 
var
  i: integer;
begin
  ListView1.ViewStyle := vsReport;
  AddColumn('root');
  AddColumn('type');
  AddColumn('label');
  AddColumn('file system');
  AddColumn('Serial Number');
  AddColumn('MaxFileNameLen');
  for i := low(FlagStrs) to high(FlagStrs) do
    AddColumn(FlagStrs[i]);
  AddColumn('FreeAvalilable');
  AddColumn('TotalSpace');
  AddColumn('TotalFree');
  Button1.Click;
end;