PDA

View Full Version : سوال: پیدا کردن لیست درایو های کامپیوتر



fire.angle
شنبه 13 فروردین 1390, 18:08 عصر
این کد مربوط به پیدا کردن لیست درایو های کامپیوتر هست


Function GetCDList : String;
Var
I : Integer;
Drives: Integer;
Tmp : String;
begin
Drives := GetLogicalDrives;
Result := '';
// units A=0 to el Z=25
For I := 0 To 25 Do
If (((1 Shl I) And Drives)<>0) Then
Begin
Tmp := Char(65+I)+':\';
If (GetDriveType(PChar(Tmp))=DRIVE_FIXED) Then
Result := Result+Char(65+I) + ';';
End;
End;


حالا سوالم اینه که منظور از کد خط های 11 و 13 چیه هست؟

vcldeveloper
یک شنبه 14 فروردین 1390, 00:37 صبح
خروجی GetLogicalDrives یک مقدار عددی هست که در مبنای 2، هر رقمش مربوط به یکی از درایوهای موجود هست، اگر یک باشه، یعنی اون درایو در سیستم موجوده.
در خط 11، در هر بار گردش حلقه، مقدار باینری (مبنای 2) عدد 1 به میزان شمارنده حلقه به سمت چپ شیفت میشه، و سپس با خروجی تابع GetLogicalDrives به صورت منطقی AND میشه، تا مشخص بشه که آیا بیت مربوط به یک درایو خاص در خروجی GetLogicalDrives یک هست یا صفر.
مثلا اگر سیستم شما یک درایو فلاپی و دو درایو هارد دیسک داشته باشه، خروجی GetLogicalDrives به صورت عدد باینری 1101 خواهد بود. حالا فرضا برای درایو D، حلقه چهار بار گردش میکنه و مقدار I = 3 میشه. 1 که سه واحد شیفت به چپ بشه، از نظر باینری میشه: 1000. این مقدار با 1101 که AND بشه، خروجی اش میشه 1. اگر درایو D وجود نداشت، خروجی GetLogicalDrives می شد 101، و خروجی AND شما میشد 0.

وقتی که مشخص شد که درایوی وجود داره، برای تشخیص نام اون درایو از کد خط 13 استفاده میشه. نام درایو ها به ترتیب حروف الفبای انگلیسی از A تا Z هست، پس برای تعیین نام درایو، کافیه I واحد به کد اسکی حرف A (کد 65) اضافه کنیم. برای درایو D مثال بالا، I = 3 هست، پس نام درایو ما میشه کارکتر اسکی 65 + 3 که همون حرف D هست.

وقتی نام درایو هم مشخص شد، با تابع GetDriveType نوع درایو بررسی میشه، و اگر نوع داریو DRIVE_FIXED بود، اسم اون درایو به خروجی تابع اضافه میشه. در نهایت، تابع لیستی از درایو های Fixed موجود در سیستم را به صورت یک string برگشت میده. البته دقت داشته باشید که خروجی این تابع با اسمی که برای تابع انتخاب کردید (GetCDList) همخوانی نداره. این تابع لیست CD Drive ها را برگشت نمیده. اگر میخواید که لیست CD Drive ها را داشته باشید، باید به جای DRIVE_FIXED در خط 14، از DRIVE_CDROM استفاده کنید.

Felony
یک شنبه 14 فروردین 1390, 06:25 صبح
به شخص به جای استفاده از اون همه کد به صورت زیر عمل میکنم :

var
Drive: Char;
begin
for Drive:= 'A' to 'Z' do
if GetDriveType(PChar(Drive + ':') = DRIVE_FIXED then
ListBox1.Items.Add(Drive + ':\');
end;