Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

определить буквы винчестеров   Найти похожие ветки 

 
dddim   (2005-07-28 12:22) [0]

вот код:
uses
FileCtrl;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ListBox1: TListBox;
   procedure Button1Click(Sender: TObject);
   function DriveExists (Drive: Byte) : boolean;
 
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 s:string ;
 b:pchar;
implementation

{$R *.dfm}

function tform1.DriveExists (Drive: Byte) : boolean;
begin
 Result := Boolean (GetLogicalDrives and (1 shl Drive));
end;

procedure TForm1.Button1Click(Sender : TObject);
var Drive : byte;
begin
for Drive := 0 to 25 do
If DriveExists (Drive) then
begin
s:=chr(Drive+$41);
b:=pchar(s);
if GetDriveType(b)=8 then
ListBox1.Items.Add (Chr(Drive+$41));
end;
end;
end.

на все драйвы(флопик,винты,сидюки) выдаёт 1.
если я не ошибаюсь 1-значит диска под такой буквой нет.


 
begin...end ©   (2005-07-28 13:03) [1]

> dddim   (28.07.05 12:22)

> if GetDriveType(b)= ...

Открываем справку по API и читаем описание функции GetDriveType, а именно -- назначение её единственного параметра:

pRootPathName
Points to a null-terminated string that specifies the root directory of the disk to return information about.


А Вы передаёте не путь к корневому каталогу, а просто букву диска. Поэтому и "выдаёт 1".
Нужно передавать в GetDriveType не b, а PChar(s + ":\").

> Result := Boolean (GetLogicalDrives and (1 shl Drive))

А вот такие эксперименты рано или поздно до добра не доведут.

Вообще для решения этой задачи я бы использовал такой код::

procedure TForm1.Button1Click(Sender: TObject);
var
 AllDrives: Cardinal;
 I: Byte;
 Ch: Char;
begin
 AllDrives := GetLogicalDrives;
 for I := 0 to 24 do
   if (AllDrives and (1 shl I)) <> 0 then
   begin
     Ch := Chr(I + Ord("A"));
     if GetDriveType(PChar(Ch + ":\")) = DRIVE_FIXED then
       ListBox1.Items.Add(Ch)
   end
end.


 
Vasia   (2005-07-28 13:07) [2]

GetLogicalDrives
The GetLogicalDrives function retrieves a bitmask representing the currently available disk drives.

Return Values
If the function succeeds, the return value is a bitmask representing the currently available disk drives. Bit position 0 (the least-significant bit) is drive A, bit position 1 is drive B, bit position 2 is drive C, and so on.


 
Vasia   (2005-07-28 13:11) [3]

if GetDriveType(PChar(Ch + ":\")) = DRIVE_FIXED then
И что определили что диск не съемный и все, а если в системе несколько винтов, то как сопаставить их логическим диска? Сколько на каком винте логических дисков и их буквы?


 
begin...end ©   (2005-07-28 13:16) [4]

> Vasia   (28.07.05 13:11) [3]

У физических дисков нет букв. И, тем более, нет корневых каталогов. А вот у логических -- есть.
И код [1] определяет именно список логических дисков на винчестерах. Что же ещё нужно-то?


 
Vasia   (2005-07-28 13:26) [5]

У физических дисков нет букв. И, тем более, нет корневых каталогов. А вот у логических -- есть
согласен, а если два винта на первом логические диски с:\ и d:\ на втором e:\ ну и как из выше приведенного кода понять что диск d на первом винте а не на втором, да и вообще не понятно сколь всего винчестеров в системе. Да и DRIVE_FIXED это просто диск с несъемным носителем и это не дает гарантии что это именно винт....


 
begin...end ©   (2005-07-28 13:35) [6]

> Vasia   (28.07.05 13:26) [5]

> а если два винта на первом логические диски с:\ и d:\
> на втором e:\ ну и как из выше приведенного кода
> понять что диск d на первом винте а не на втором

Из приведённого выше кода -- никак не понять.
Но можно посмотреть на заголовок ветки: "определить буквы винчестеров". Я понимаю это так: получить буквы логических дисков винчестеров. Требования различать, какой логический диск на каком физическом находится, я в вопросе не вижу.


 
Vasia   (2005-07-28 13:45) [7]

Я понимаю это так: получить буквы логических дисков винчестеров.
Ладно бог с ним с опастовление логических и физических дисков. Смотрим MSDN что же нам возвражает сия функция GetDriveType, DRIVE_FIXED, ага смотрим что это значит: "The disk cannot be removed from the drive." - "Это диск не может быть удален из устройства" и черт подери ни чего не сказано о типе устройства, кто тебе сказал что это обязательно вент!?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.06 c
14-1125502212
БарЛог
2005-08-31 19:30
2005.09.25
Задачки по Си


14-1125467609
CHES
2005-08-31 09:53
2005.09.25
Поклонники Opera. Всем срочно на их сайт


4-1123009263
Михаил(Киров)
2005-08-02 23:01
2005.09.25
Иконки на панели индикаторов


14-1125399088
Игорь Шевченко
2005-08-30 14:51
2005.09.25
Читать. Просветляться.


3-1123866790
NikNet
2005-08-12 21:13
2005.09.25
Что такое CASE система?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский