По букве диска (тома), определяем номер диска в системе.
1 2 3 4 5 6 7 8 |
var volLetter: Char; driveIndex: Integer; begin volLetter:= 'C'; driveIndex:= getDeviceNumberByLetter(volLetter); ShowMessage(IntToStr(driveIndex)); end; |
Параметры
volLetter - буква диска без двоеточия
Результат
Номер диска в случае успеха и (-1) в случае неудачи или если диск не существует.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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; if not DirectoryExists(ALetter + ':\') then exit; 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; |