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

Часть информации о диске можно получить при помощи функции 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;

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...