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

=== Информация о дисках ===
Часть информации о диске можно получить при помощи функции 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;
Author: Даниил Карапетян
Source: http://delphi4all.narod.ru
ID: 01383