|
Вопрос # 1 713/ вопрос открыт / |
|
Здравствуйте, эксперты!
Скажите, как определить тип диска. GetVolumeInformation не подходит (флопик не находит, CD-ROM считает за фиксированный диск).
 |
Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 21 июня 2008, 14:16
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Трофимов Евгений!
В своё время я решал подобную задачу. Вот вам пример кода (две метода от огромного класса). Там достаточно кода, что бы понять, как составляется список всех доступных дисков
procedure TOneDisk.processes(d: char; tip: cardinal);
const
NameSize = 4;
VolumeCount = 26;
TotalSize = NameSize * VolumeCount;
Report = 'Volume: %s %s';
var
Volume: string;
lpQuery: array [0..MAXCHAR - 1] of char;
begin
FLetter := d;
Volume := ' ';
Volume[1] := FLetter;
Volume[2] := ':';
Volume[3] := '\';
case tip of
DRIVE_UNKNOWN: FDescription := 'The drive type cannot be determined.';
DRIVE_NO_ROOT_DIR: FDescription :=
'The root path is invalid. For example, no volume is mounted at the path.';
DRIVE_REMOVABLE:
begin
Volume[3] := #0;
QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
Volume[3] := '\';
if string(lpQuery) = '\Device\Floppy0' then
FDescription := 'The drive is a Floppy disk A:.'
else
if string(lpQuery) = '\Device\Floppy1' then
FDescription := 'The drive is a Floppy disk B:.'
else
FDescription := 'The drive is a Flash Drive.';
end;
DRIVE_FIXED:
begin
Volume[3] := #0;
QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
Volume[3] := '\';
if Copy(string(lpQuery), 1, 22) = '\Device\HarddiskVolume' then
FDescription := 'The disk cannot be removed from the drive.'
else
FDescription := 'The drive is a SUBST disk on path: "' +
Copy(string(lpQuery), 5, Length(string(lpQuery))) + '"';
end;
DRIVE_REMOTE: FDescription :=
'The drive is a remote (network) drive.';
DRIVE_CDROM: FDescription :=
'The drive is a CD-ROM drive.';
DRIVE_RAMDISK: FDescription :=
'The drive is a RAM disk.';
end;
end;
procedure TDiskList.init;
var
d: char;
i: cardinal;
disk: TOneDisk;
begin
for d := 'A' to 'Z' do
begin
i := GetDriveType(PAnsiChar(string(d + ':\')));
if i = 1 then
Continue;
disk := add;
disk.processes(d, i);
end;
end;
Этот код умеет различать флешки/диски/диски с subst и прочие разновидности
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 21 июня 2008, 17:11
Оценка за ответ: 5
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|