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

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

Code:

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;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить