FAQ VCL
Железо\Диски\HDD & Floppy

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как узнать количество секторов в кластере на указанном диске?

function GetSectorsPerCluster( Disk: char ): Cardinal;
var
  SectorsPerCluster: Cardinal;    // Количество секторов в кластере
  BytesPerSector: Cardinal;       // Количество байт в секторе
  NumberOfFreeClusters: Cardinal; // Количество свободных кластеров
  TotalNumberClusters: Cardinal;  // Общее количество кластеров
begin
   GetDiskFreeSpace( PChar( Disk + ':\' ),
                     SectorsPerCluster, BytesPerSector,
                     NumberOfFreeClusters, TotalNumberClusters );
   Result := SectorsPerCluster;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( IntToStr( GetSectorsPerCluster( 'c' ) ) );
end;


Как узнать количество байт в секторе на указанном диске?

function GetBytesPerSector( Disk: char ): Cardinal;
var
  SectorsPerCluster: Cardinal;    // Количество секторов в кластере
  BytesPerSector: Cardinal;       // Количество байт в секторе
  NumberOfFreeClusters: Cardinal; // Количество свободных кластеров
  TotalNumberClusters: Cardinal;  // Общее количество кластеров
begin
   GetDiskFreeSpace( PChar( Disk + ':\' ),
                     SectorsPerCluster, BytesPerSector,
                     NumberOfFreeClusters, TotalNumberClusters );
   Result := BytesPerSector;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( IntToStr( GetBytesPerSector( 'c' ) ) );
end;


Как отформатировать диск?

uses
  {...,} ShellAPI;

function SHFormatDrive( hWnd: HWND; Drive: Word; fmtID: Word;
                        Options: Word ): Longint; stdcall;
external 'Shell32.dll' name 'SHFormatDrive';

procedure TForm1.FormatDrive(Drive: char);
const
  SHFMT_ID_DEFAULT = $FFFF;

  // Быстрое (очистка оглавления диска)
  SHFMT_OPT_QUICKFORMAT = 0;
  // Полное
  SHFMT_OPT_FULLFORMAT = 1;
  // Только копирование системных файлов
  SHFMT_OPT_SYSONLY = 2;

  SHFMT_ERROR = -1;
  SHFMT_CANCEL = -2;
  SHFMT_NOFORMAT = -3;
var
  FmtRes: longint;
  FmtDrive: word;
begin
   FmtDrive := Ord( UpCase( Drive ) ) - 65;
   try
      FmtRes:= ShFormatDrive( Handle,
                              FmtDrive,
                              SHFMT_ID_DEFAULT,
                              SHFMT_OPT_QUICKFORMAT );
      case FmtRes of
         SHFMT_ERROR: ShowMessage( 'Error formatting the drive' );
         SHFMT_CANCEL: ShowMessage( 'User canceled formatting the drive' );
         SHFMT_NOFORMAT: ShowMessage( 'No Format' )
         else
            ShowMessage( 'Disk has been formatted' );
      end;
   except
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   FormatDrive( 'A' );
end;


Как узнать номер PhysicalDrive по букве раздела диска?

function GetDeviceNumberByLetter( ALetter: Char ): Integer;
const
  IOCTL_STORAGE_GET_DEVICE_NUMBER = $2D1080;
type
  TDeviceInfo = packed record
    DeviceType,
    DeviceNumber,
    PartitionNumber: DWORD;
  end;
var
  hDevice: THandle;
  BytesReturned: DWORD;
  DeviceInfo: TDeviceInfo;
begin
   Result := -1;
   hDevice := CreateFile( PChar( '\\.\' + ALetter + ':' ), GENERIC_READ,
                          FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
   Win32Check( hDevice <> INVALID_HANDLE_VALUE );
   try
      Win32Check( DeviceIoControl( hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, nil, 0,
                  @DeviceInfo, SizeOf( TDeviceInfo ), BytesReturned, nil ) );
      Result := DeviceInfo.DeviceNumber;
   finally
      CloseHandle( hDevice );
   end;
end;

При использовании материала - ссылка на сайт обязательна