Delphi Skyline
جمعه 18 آذر 1384, 12:34 عصر
با سلام
چظوری بفهمیم که مثلا دیسک d چندمین پارتیشن ار هارد دیسک است ؟؟
vcldeveloper
شنبه 19 آذر 1384, 05:22 صبح
با این کد می تونی شماره یک پارتیشن در دیسک مربوط به اون پارتیشن رو بدست بیاری:
const
IOCTL_DISK_BASE: Cardinal = $00000007;
IOCTL_DISK_GET_DRIVE_GEOMETRY: Cardinal = $00070000;
IOCTL_DISK_GET_PARTITION_INFO: Cardinal = $00074004;
IOCTL_DISK_SET_PARTITION_INFO: Cardinal = $0007c008;
IOCTL_DISK_GET_DRIVE_LAYOUT: Cardinal = $0007400c;
IOCTL_DISK_SET_DRIVE_LAYOUT: Cardinal = $0007c010;
IOCTL_DISK_VERIFY: Cardinal = $00070014;
type
PARTITION_INFORMATION = ^_PARTITION_INFORMATION;
_PARTITION_INFORMATION = record
StartingOffset,
PartitionLength : LARGE_INTEGER;
HiddenSectors,
PartitionNumber : DWORD;
PartitionType : Byte;
BootIndicator,
RecognizedPartition,
RewritePartition : Boolean;
end;
function GetPartitionNumber(DriveLetter : Char) : integer;
var
pi :PARTITION_INFORMATION;
BytesReturned : Cardinal;
hDrive : Cardinal;
DrivePath : string;
R : LongBool;
ErrMsg : array [0..127] of char;
begin
Result := -1;
New(pi);
try
DrivePath := '\\.\' + DriveLetter + ':';
hDrive := CreateFile(PAnsiChar(DrivePath),
GENERIC_READ+GENERIC_WRITE,
FILE_SHARE_READ+FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
if hDrive = INVALID_HANDLE_VALUE then
raise Exception.Create('Error in openning the drive');
R := DeviceIoControl(hDrive,
IOCTL_DISK_GET_PARTITION_INFO,
nil,
0,
pi,
SizeOf(pi^),
BytesReturned,
nil);
if not R then
begin
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil,GetLastError,
LOCALE_USER_DEFAULT,ErrMsg,SizeOf(ErrMsg), nil);
raise Exception.Create(ErrMsg);
end;
Result := pi.PartitionNumber;
finally
CloseHandle(hDrive);
Dispose(pi);
end;
end;
مثال:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetPartitionNumber('E')));
end;
برای اطلاعات بیشتر به راهنمای مربوط به PARTITION_INFORMATION در MSDN مراجعه کن.
Delphi Skyline
یک شنبه 27 آذر 1384, 15:32 عصر
با تشکر از شما .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.