Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
4-1122611364
Galim
2005-07-29 08:29
2005.09.25
TComPortDriver


9-1110990439
Fosgen
2005-03-16 19:27
2005.09.25
Проблема при переносе проги из оконного в полный экран в GLScene


4-1123059315
Гость22
2005-08-03 12:55
2005.09.25
Можна ли узнать, занят файл или нет (на чтение, запись)?


1-1124634033
Дмитрий_05
2005-08-21 18:20
2005.09.25
Как избавиться от двойной прорисовке окна


8-1115329602
ronyn
2005-05-06 01:46
2005.09.25
Как подключяются кодаки?