Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2011, 14:05   #1
vvn94
 
Регистрация: 23.12.2007
Сообщений: 4
По умолчанию Узнать букву диска, зная его название

Возникла такая проблема: хочу написать программу, которая определяет все жёсткие диски, которые подключены в системе (в том числе и по usb) выводит названия самих дисков и буквы томов (под которыми они видны в системе), расположенных на этих дисках.
Первую часть я смог написать, а вот как получить букву тома мне непонятно. Вот, собственно говоря, код:
Код:
function GetDeviceName(PnPHandle: HDEVINFO; const DevData: TSPDevInfoData): string;
var
  BytesReturned: DWORD;
  RegDataType: DWORD;
  Buffer: array [0..256] of CHAR;
begin
  BytesReturned := 0;
  RegDataType := 0;
  Buffer[0] := #0;
  SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_FRIENDLYNAME,
    RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
  Result := Buffer;
  if Result<>'' then exit;
  BytesReturned := 0;
  RegDataType := 0;
  Buffer[0] := #0;
  SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_DEVICEDESC,
    RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
  Result:=Buffer;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
  DrivePnPHandle: HDEVINFO;
  DeviceNumber:DWORD;
  DevData: TSPDevInfoData;
  DeviceInterfaceData: TSPDeviceInterfaceData;
  RES:BOOL;
begin
  DrivesListBox.Clear;
  DrivePnPHandle := SetupDiGetClassDevs(@GUID_DEVCLASS_DISKDRIVE, nil, 0, DIGCF_PRESENT {or DIGCF_PROFILE});

  if DrivePnPHandle = INVALID_HANDLE_VALUE then  Exit;

  DeviceNumber := 0;
  repeat
  // DevData:=GetMemory(sizeof(TSPDevInfoData));

   DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
   DevData.cbSize := SizeOf(TSPDevInfoData);
   RES := SetupDiEnumDeviceInfo(DrivePnPHandle, DeviceNumber, DevData);
   if (RES) then
    begin
     DrivesListBox.Items.Add(GetDeviceName(DrivePnPHandle, DevData));
     Inc(DeviceNumber);
    end;
  until not RES;

  SetupDiDestroyDeviceInfoList(DrivePnPHandle);
  DrivesListBox.Enabled:=true;
end;
Мучаюсь уже долго - ничего не могу придумать. Впринципе возможна и обратная операция - найти все буквы томов в системе, а потом для каждого узнать принадлежность диску/флэшке, но это у меня тоже не получается.
Подскажите кто-нибудь, как справиться с проблемой

Последний раз редактировалось vvn94; 19.06.2011 в 21:31.
vvn94 вне форума Ответить с цитированием
Старый 19.06.2011, 16:48   #2
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Самый простой способ :

Код:
var
  Drive: Char;
  DriveLetter: String[4];
begin
  for Drive := 'A' to 'Z' do
  begin
    DriveLetter := Drive + ':\';
    case GetDriveType(PChar(Drive + ':\')) of
      DRIVE_REMOVABLE:
        Memo1.Lines.Add(DriveLetter + '     Флеш');
      DRIVE_FIXED:
        Memo1.Lines.Add(DriveLetter + '     Локальный');
      DRIVE_REMOTE:
        Memo1.Lines.Add(DriveLetter + '     Сетевой');
      DRIVE_CDROM:
        Memo1.Lines.Add(DriveLetter + '     CD-ROM ');
    end;
  end;
end;

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 19.06.2011, 19:31   #3
vvn94
 
Регистрация: 23.12.2007
Сообщений: 4
По умолчанию

так я пытался делать, но, во-первых, так жёсткий диск, который по usb подключается, не определяется как DRIVE_REMOVABLE, а во-вторых, дальше всё равно не понятно, как определить имя подключённого диска, а мне надо, чтобы программа работала именно для определённого устройства, а на другие не реагировала.
vvn94 вне форума Ответить с цитированием
Старый 19.06.2011, 22:41   #4
JetUS
Пользователь
 
Аватар для JetUS
 
Регистрация: 23.09.2009
Сообщений: 27
По умолчанию

Цитата:
Сообщение от vvn94 Посмотреть сообщение
так я пытался делать, но, во-первых, так жёсткий диск, который по usb подключается, не определяется как DRIVE_REMOVABLE, а во-вторых, дальше всё равно не понятно, как определить имя подключённого диска, а мне надо, чтобы программа работала именно для определённого устройства, а на другие не реагировала.
По моему ОС и не должна определять его как DRIVE_REMOVABLE. Если хотите, можете отслеживать событие присоединения устройства и таким образом работать именно с ним.
JetUS вне форума Ответить с цитированием
Старый 19.06.2011, 22:54   #5
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Вот еще такое есть : (вложенный файл).

Применение :

Код:
Var

	S,SOut : String;
	I : Integer;
	VolumeName,FileSystemName : String;
	VolumeSerialNo,MaxComponentLength,FileSystemFlags:LongWord;

begin
	S:=GetDisks(DiskHDD); {Получаем список Жёстких дисков (Параметр DiskHDD)}
	SOut:='';
	For I:=1 to Length(S) do {Получаем информацию о всех дисках и пишем в TLabel на форме}

	Begin

	{Если диск существует/вставлен ...}
	if GetHDDInfo(S[I], VolumeName, FileSystemName, VolumeSerialNo,
	MaxComponentLength, FileSystemFlags) then {... тогда собираем информацию}
	SOut:=SOut+
	'Диск: '+S[I]+#13#10+
	'Метка: '+VolumeName+#13#10+
	'Файловая система: '+FileSystemName+#13+#10+
	'Серийный номер: '+IntToHex(VolumeSerialNo,8)+#13+#10+
	'Макс. длина имени файла: '+IntToStr(MaxComponentLength)+#13+#10+
	'Flags: '+IntToHex(FileSystemFlags,4)+#13#10+#13#10;

	End;

	Memo2.Lines.Add(SOut); {Выводим  полученные данные о дисках}

end;
Цитата:
Сообщение от vvn94 Посмотреть сообщение
во-первых, так жёсткий диск, который по usb подключается, не определяется как DRIVE_REMOVABLE,..
Ну, видимо жесткий диск по любому определяется как DRIVE_FIXED
Вложения
Тип файла: rar HDDInfo.rar (1.1 Кб, 288 просмотров)

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 19.06.2011, 23:23   #6
vvn94
 
Регистрация: 23.12.2007
Сообщений: 4
По умолчанию

volod3000, спасибо. Библиотека очень помогла. Решил проблему.
vvn94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Делфи. Функция, возвращающая букву системного диска(раздела). Или как ее можно получить по-другому? быдлокодер Помощь студентам 2 08.06.2010 23:26
Как найти название класса процеса зная его handle? Dazz Win Api 3 16.03.2010 11:35
Узнать имя текущего пользователя и букву диска с запущенной Windows Vistar Общие вопросы .NET 1 02.12.2009 18:16
Могу ли я извлечь данные, из БД не зная напрямую название имеющейся в ней таблицы. Cabyrc БД в Delphi 11 27.03.2009 01:16
Как определить букву диска? Борис2 Паскаль, Turbo Pascal, PascalABC.NET 2 06.12.2007 22:16