@nalimite

Delphi. Как Узнать номер диска по его букве?

Привет. Пишу програмулину и требуется получить номер диска, для создания батника в diskpart.
Нужно получить номер системного диска
Что именно нужно узнать, на скриншоте.
Вопрос в том, как получить номер диска стандартными методами Delphi ?

hHKxZHD.png
  • Вопрос задан
  • 745 просмотров
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
type
  TDiskExtent = record
    DiskNumber: Cardinal;
    StartingOffset: Int64;
    ExtentLength: Int64;
  end;
  
  TVolumeDiskExtents = record
    NumberOfDiskExtents: Cardinal;
    Extents: array[0..0] of TDiskExtent;
  end;

  PVolumeDiskExtents = ^TVolumeDiskExtents;

...

const
  METHOD_BUFFERED                      = 0;
  FILE_ANY_ACCESS                      = 0;
  IOCTL_VOLUME_BASE                    = DWORD('V');
  IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = ((IOCTL_VOLUME_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or (0 shl 2) or METHOD_BUFFERED);

...

function GetLD(Drive: Char):Cardinal;
var
  Buffer : String;
begin
  Buffer := Format('\\.\%s:', [Drive]);
  Result := CreateFile(PChar(Buffer), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
end;

function GetPhysicalDiskNumber(Drive: Char):Byte;
var
  LD : DWORD;
  DiskExtents : PVolumeDiskExtents;
  DiskExtent : TDiskExtent;
  BytesReturned : Cardinal;
begin
  Result := MAXBYTE;
  LD := GetLD(Drive);
  if LD = INVALID_HANDLE_VALUE then exit;

  try
    DiskExtents := AllocMem(Max_Path);
    DeviceIOControl(LD, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, nil, 0, DiskExtents, Max_Path, BytesReturned, nil);
    if DiskExtents^.NumberOfDiskExtents > 0 then
    begin
      DiskExtent := DiskExtents^.Extents[0];
      Result := DiskExtent.DiskNumber;
    end;
  finally
    CloseHandle(LD);
  end;
end;


Источник: https://www.experts-exchange.com/questions/2413489... (я код немного подправил)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
stackoverflow.com/questions/5501749/how-do-you-get...
На Паскаль сам переведёшь? Внимание, работает только для фиксированных дисков.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы