Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Узнать имя и букву флешки флешки


Автор: BEST13 7.10.2008, 21:30
Я пишу меню для флешки. И мне нужно отображать название и букву которую дала винда флешке. 
Я искал в поиске, ничего не нашол. Подскажыте как это можно узнать?
И еще вопрос, чтоб узнать объём памяти флешки и объём свободного места можно пользоваться алгоритмом для дисков?

Автор: ne0n 7.10.2008, 22:09
BEST13, наверно преблизительно вот так:
Код

var
  Drive: Char; //Буква диска
const
  pref = ':\';
begin

  for Drive := 'A' to 'Z' do
    if GetDriveType(PChar(Drive + pref)) = DRIVE_REMOVABLE then .... // в Drive Буква флешки





з.ы. Почему синтаксис не подсвечиваеться?

Автор: BEST13 7.10.2008, 22:58
пасиб... а как вывести букву в лейблу.  Если делаю так Label.Caption:= Drive; выписывает ошибки: "For loop control variable must be simple local variable", "TO' expected but ';' found".

Автор: ne0n 7.10.2008, 23:12
забыл сказть что надо исключить из поиска диск A, он тоже сьемным считаеться. вообщем вот код, который только что у себя протестил:

Код

procedure TForm1.btn1Click(Sender: TObject);
 var
  Drive: Char; //Буква диска
const
  pref = ':\';
begin

  for Drive := 'B' to 'Z' do
    if GetDriveType(PChar(Drive + pref)) = DRIVE_REMOVABLE then lbl1.Caption:=Drive+ pref;
end;

Автор: Riply 8.10.2008, 00:13
Цитата(ne0n @  7.10.2008,  23:12 Найти цитируемый пост)
забыл сказть что надо исключить из поиска диск A, он тоже сьемным считаеться. вообщем вот код, который только что у себя протестил:


А также забыл сказать, что надо выдавать грозное предупреждение пользователю,
чтобы, не дай бог, он не подсоединил две флешки сразу smile

Автор: ne0n 8.10.2008, 00:39
Цитата(Riply @  8.10.2008,  00:13 Найти цитируемый пост)
А также забыл сказать, что надо выдавать грозное предупреждение пользователю,чтобы, не дай бог, он не подсоединил две флешки сразу 

 ну дык просили лайбел - сделал лэйбел, у меня изначально все заносилось в СтрингЛист, поэтому троеточие то и поставил в первом варианте кода, предложил ТС додумать самому, что ему надо  smile 

Автор: Riply 8.10.2008, 01:17
Цитата(ne0n @  8.10.2008,  00:39 Найти цитируемый пост)
 ну дык просили лайбел - сделал лэйбел, у меня изначально все заносилось в СтрингЛист


Тогда ожидай следующего вопроса (кстати, вполне закономерного) :
как из 38-и подключенных флешек, выбрать нужную ?  smile



Автор: ne0n 8.10.2008, 11:11
Цитата(Riply @  8.10.2008,  01:17 Найти цитируемый пост)
, выбрать нужную ?  

что значит нужную?!) если они подключены -  значит они все нужны smile 


Автор: BEST13 8.10.2008, 15:37
большое спс... + ищё вопрос а имя как узнать?

Автор: Riply 8.10.2008, 16:20
Цитата(ne0n @  8.10.2008,  11:11 Найти цитируемый пост)
что значит нужную?!) если они подключены -  значит они все нужны 


Это не совсем так.  
Не все, что блестит... ой тьфу !
Не все, что  "DRIVE_REMOVABLE" - флешка smile
Например, Zip-disk.

P.S.
 Очень вероятно, что истинно обратное утверждение: если флешка, то DRIVE_REMOVABLE.
 Но лично я и под ним бы не стала подписываться smile

Автор: BEST13 8.10.2008, 18:26
А насчот имени никто не знает?

Автор: Riply 8.10.2008, 18:48
Цитата(BEST13 @  8.10.2008,  18:26 Найти цитируемый пост)
А насчот имени никто не знает?


Если ты пояснишь что понимается под термином "имя флешки",
то тебе, наверное, помогут.

Лично я не смогла догадаться smile

Автор: mr.Anderson 8.10.2008, 18:55
Riply, а что пояснять? smile Имя флешки оно и есть имя флешки. Вот флешку вставляете в комп - появляется дополнительный раздел, у которого есть свое имя, которое пользователь может поменять. Вот его и требуется узнать.

Автор: BEST13 8.10.2008, 19:27
Цитата(mr.Anderson @  8.10.2008,  18:55 Найти цитируемый пост)
Riply, а что пояснять?  Имя флешки оно и есть имя флешки. Вот флешку вставляете в комп - появляется дополнительный раздел, у которого есть свое имя, которое пользователь может поменять. Вот его и требуется узнать.


Совершено, верно. Я это и имел ввиду  smile 

Автор: MIX55 8.10.2008, 19:35
Код

procedure TForm1.Button1Click(Sender: TObject);
var
VolumeName,FileSystemName : array [0..MAX_PATH-1] of Char;
 VolumeSerialNo : DWord;
 MaxComponentLength,FileSystemFlags : longword;
begin
GetVolumeInformation(PChar(DriveName),VolumeName,MAX_PATH,@VolumeSerialNo,
                      MaxComponentLength,FileSystemFlags,FileSystemName,MAX_PATH);
label1.Caption:=VolumeName;
end;


параметр DriveName должен быть вида 'F:\'. где F  буква твоей флешки

Добавлено через 10 минут и 50 секунд
Цитата

Например, Zip-disk.


Riply как ж тогда решить данную проблему (используя DeviceIoControl)? Ты же спец. в данной области.

Автор: Riply 8.10.2008, 19:55
Цитата(mr.Anderson @  8.10.2008,  18:55 Найти цитируемый пост)
Riply, а что пояснять?  Имя флешки оно и есть имя флешки. Вот флешку вставляете в комп - появляется дополнительный раздел, у которого есть свое имя, которое пользователь может поменять.


Век живи - век учись smile
Не знала (ибо никогда не пробовала), что можно простым Rename`ом поменять "имя флешки"
Впрочем,  также не знала, что это не что иное, как "имя флешки " smile

Добавлено @ 20:06
Цитата(MIX55 @  8.10.2008,  19:35 Найти цитируемый пост)
Riply как ж тогда решить данную проблему (используя DeviceIoControl)? Ты же спец. в данной области.


Для этого требуется небольшой тайм-аут (надо поднять исходники).  OK ?

P.S.
 Я, конечно, пакда на комплименты ( спасибоsmile ),  но "спец" это слишком громко smile


Автор: BEST13 8.10.2008, 20:25
Цитата


Код

procedure TForm1.Button1Click(Sender: TObject);
var VolumeName,FileSystemName : array [0..MAX_PATH-1] of Char; 
      VolumeSerialNo : DWord; 
      MaxComponentLength,FileSystemFlags : longword;
begin
GetVolumeInformation(PChar(DriveName),VolumeName,MAX_PATH,@VolumeSerialNo,
                                 MaxComponentLength,FileSystemFlags,FileSystemName,MAX_PATH);
              label1.Caption:=VolumeName;
end;

параметр DriveName должен быть вида 'F:\'. где F  буква твоей флешки


спасиб, попробую MIX55. Интересно узнать решение  проблемы Riply, зарание спс.

Автор: Riply 9.10.2008, 10:31
Цитата(MIX55 @  8.10.2008,  19:35 Найти цитируемый пост)
Riply как ж тогда решить данную проблему (используя DeviceIoControl)?


С нахрапа, мне не удалось решить данную задачу.
Серьезно же к ней подойти мешают два момента: отсутствие времени
и устройств(а также систем) для тестирования.
Даже, если упростить условия до описанных ниже, все равно будут сложности.
Камеры и плееры пусть будут тоже флешками, но USB HDD надо отфильтровать. 
Т.е. что-то типа такого:
function FlushTest(const pDevice: PVOID)
begin
 if ( any CD or DVD or Blu-Ray drive ) {including U3 emulated CDs} then Result := False;
 if ( USB or firewire ) then
  begin
   if ( flash drive or player or camera or card reader ) then Result := True;
   if ( hard disk or legacy floppy ) then Result := False;
  end;
 if ( IDE hard disk or SCSI hard disk or SATA hard disk or legacy floppy or zip drive ) then Result := False;
 if ( subst drive or RAM drive or any other "fake" drive ) then Result := False;
end;
CD\DVD и RAMDrive легко отличить по GetDriveType. Дальше - хуже.
Есть(?) некоторая закономерность - для флешки путь
имеет вид device\harddisk%d\... , а не device\harddiskvoulme%d. 
Но мой знакомый утверждает, что в Висте в этом плане флешки не отличимы от жестких дисков. 
Возможно, Bиста поддерживает и более одного раздела на флешках.
(Сама проверить не могу из-за отсутствия Висты)
Можно попробоать танцевать от USB не-USB.
Вот, некоторая информация, если кто захочет продолжить поиски smile
IOCTL_STORAGE_GET_HOTPLUG_INFO - флаг DeviceHotplug скорее всего будет
означать USB. Начиная с ХР.
SetupDiGetClassDevs с 'USBSTOR' - вроде. то что надо. Начиная с 98.
SetupDiGetClassDevs + SetupDiGetDeviceRegistryProperty с
SPDRP_REMOVAL_POLICY -на этот способ намекали в описании GetDriveType.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)