unit UFileInf;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Number, FileLength, VolFlags: DWORD;
    SystemName: array [0..127] of char;
    Drives, Buf: array [0..255] of Char;
    S: string;
    i: integer;
    P: PChar;
    FreeAvailable, TotalSpace, TotalFree: TLargeInteger;
begin
 RichEdit1.Clear;
 if GetLogicalDriveStrings(256,Drives) > 256
  then exit;
 P := Drives;
 while P^ <> #0 do
 begin
  S := 'Диск ' + P;
  i := GetDriveType(P);
  case i of
   0: S := S + ' неизвестного типа';
   DRIVE_REMOVABLE: S := S + ' съемный';
   DRIVE_REMOTE:    S := S + ' сетевой';
   DRIVE_CDROM:     S := S + ' CD-ROM';
   DRIVE_RAMDISK:   S := S + ' в ОЗУ';
   else S := S + ' локальный';
  end;
  RichEdit1.SelAttributes.Style := [fsBold];
  RichEdit1.Lines.Add(S);
  RichEdit1.SelAttributes := RichEdit1.DefAttributes;
  if (i = DRIVE_FIXED) or (i = DRIVE_REMOTE)
  then begin
   if GetVolumeInformation(P, Buf, 256,
                                @Number, FileLength, VolFlags, SystemName, 128)
    then begin
     RichEdit1.Lines.Add('идентификатор - ' + Buf);
     RichEdit1.Lines.Add('серийный номер - ' + IntToStr(Number));
     GetDiskFreeSpaceEx(P,FreeAvailable, TotalSpace, @TotalFree);
     RichEdit1.Lines.Add('емкость - ' + IntToStr(TotalSpace shr 20) +
                         ' МБ (' + IntToStr(TotalSpace) + ' байт)');
     RichEdit1.Lines.Add('свободно - ' + IntToStr(TotalFree shr 20) +
                         ' МБ (' + IntToStr(TotalFree) + ' байт)');
     RichEdit1.Lines.Add('доступно - ' + IntToStr(FreeAvailable shr 20) +
                         ' МБ (' + IntToStr(FreeAvailable) + ' байт)');
     RichEdit1.Lines.Add('система - ' + SystemName);
     if (VolFlags and FS_FILE_COMPRESSION) > 0
      then RichEdit1.Lines.Add('поддерживает сжатие')
      else RichEdit1.Lines.Add('не поддерживает сжатие') ;
     RichEdit1.Lines.Add('максимальная длина имен файлов - ' + IntToStr(FileLength));
     if (VolFlags and FS_CASE_IS_PRESERVED) > 0
      then RichEdit1.Lines.Add('сохраняет регистр имен файлов');
     if (VolFlags and FS_PERSISTENT_ACLS) > 0
      then RichEdit1.Lines.Add('поддерживает ACL');
    end;
  end;
  P := P + 4;
 end;
end;

end.
