Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить инфу о жестком диске? 
:(
    Опции темы
Dayana
Дата 11.3.2003, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



Подскажите пожалуйста, как получить информацию о том, какие установлены жесткие диски, и какие метки драйвов им соответствуют?

Спасибо!
PM MAIL ICQ   Вверх
serious
Дата 11.3.2003, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Вот пример, как определить, существует ли диск в системе:

Код
function 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
    ListBox1.Items.Add (Chr(Drive+$41));
   end;
end;


Теперь об информации о дисках:

исчерпывающую информацию по этому поводу дает функция GetVolumeInformation,
посмотри help, там все понятно (там и серийный номер диска, и тип файловой системы, и прочее и прочее).

Вот параметры FileSysFlags:

FS_CASE_IS_PRESERVED - (при записи на диск сохраняется регистр букв в его имени)
FS_CASE_SENSITIVE - (поддерживается поиск файлов с учетом регистра букв)
FS_UNICODE_STORED_ON_DISK - (поддерживается сохранение имен файлов в UniCode)
FS_PERSISTENT_ACLS - (поддерживаются списки контроля доступа (ACL). Только для NTFS)
FS_FILE_COMPRESSION - (поддерживается сжатие файлов на уровне системы)
FS_VOL_IS_COMPRESSED - (устройство представляет собой сжатый диск)

Определение типа диска:

Код
function GetDriveType (Drive : byte) : string;
var
 DriveLetter : Char;
 DriveType   : uInt;
begin
 DriveLetter := Char (Drive + $41);
 DriveType   := GetDriveType (PChar(DriveLetter + ':\'));
 case DriveType of

 0: Result := '?';
 1: Result := 'Path does not exists';
 Drive_Removable: Result := 'Removable';
 Drive_Fixed: Result := 'Fixed';
 Drive_Remote: Result := 'Remote';
 Drive_CDROM: Result := 'CD-ROM';
 Drive_RamDisk: Result := 'RAMDisk'
else
 Result := 'Unknown';
end;
end;



--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Dayana
Дата 12.3.2003, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



serious, спасибо! Но это все относится к драйву (логическому диску), а не к жесткому диску... Мне нужна информация именно о жеском диске, и о связи его с логическим....
PM MAIL ICQ   Вверх
AntonSaburov
Дата 12.3.2003, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Посмотри функцию DeviceIoControl - может там что получиться. Я ее мало использовал, но что-то там было.

Там есть ссылка на CreateFile - эта функция под NT может действительно вернуть хэндл на физический диск.

You can use the CreateFile function to open a disk drive or a partition on a disk drive. The function returns a handle to the disk device; that handle can be used with the DeviceIOControl function.

PM MAIL WWW ICQ   Вверх
serious
Дата 12.3.2003, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Что-то не совсем понял вопрос: тебе нужна информация типа серийный номер, объем диска, кластеры.... Так что ли? Поясни конкретнее.


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Medved
Дата 12.3.2003, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Код

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение сведений о диске (метка/имя диска, файловая система, серийный номер)

Получение информации о любом диске.
Работает на FDD, HDD, CD, другие не пробовал.

Создайте модуль с именем HDDInfo и полностью скопируйте в него весь текст.

Зависимости: Все Windows (32S,95,NT)
Автор:       cyborg, [email protected], ICQ:114205759, Бузулук
Copyright:   Собственное написание (Осипов Евгений Анатольевич)
Дата:        23 мая 2002 г.
***************************************************** }

unit HDDInfo;

interface
Uses Windows;

Const {Константы для TypeOfDisk функции GetDisks}
DiskUnknown=0; {Неизвестные диски}
DiskNone=1; {Отсутствующие диски}
DiskFDD=DRIVE_REMOVABLE; {Съёмные диски, дискеты}
DiskHDD=DRIVE_FIXED; {Не съёиные диски, жёсткие диски}
DiskNet=DRIVE_REMOTE; {Сетевые диски}
DiskCDROM=DRIVE_CDROM; {CD ROM}
DiskRAM=DRIVE_RAMDISK; {Диски в ОЗУ}

{Получить имена нужных дисков}
function GetDisks(TypeOfDisk : Word) : String;


{Функция получения информации о диске (HDD,FDD,CD) с буквой Disk}
{
Передаваемые значения:
Disk - Буква диска

Получаемые значения:
VolumeName - Метка/Имя тома
FileSystemName - Файловая система
VolumeSerialNo - Серийный номер диска (можно привязывать к диску программы)
MaxComponentLength - Максимальная длинна имени файла
FileSystemFlags - Флаги смотрите в справке Delphi по GetVolumeInformation

Функция возвращает true, если всё прошло успешно (диск нашёлся),
и false, если возникли проблемы, например диска нет в дисководе,
либо дисковода такого вообще нет
}
Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String;
        Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean;

implementation

function GetDisks(TypeOfDisk : Word) : String;{Получить имена нужных дисков}
var
 DriveArray : array[1..26] of Char;
 I : integer;
begin
 DriveArray:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 for I := 1 to 26 do
 if GetDriveType(PChar(DriveArray[I]+':\')) = TypeOfDisk then Result := Result+DriveArray[I];
end;



Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String;
         Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean;
Var
_VolumeName,_FileSystemName:array [0..MAX_PATH-1] of Char;
_VolumeSerialNo,_MaxComponentLength,_FileSystemFlags:LongWord;
Begin
 if GetVolumeInformation(PChar(Disk+':\'),_VolumeName,MAX_PATH,@_VolumeSerialNo,
 _MaxComponentLength,_FileSystemFlags,_FileSystemName,MAX_PATH) then
 Begin
   VolumeName:=_VolumeName;
   VolumeSerialNo:=_VolumeSerialNo;
   MaxComponentLength:=_MaxComponentLength;
   FileSystemFlags:=_FileSystemFlags;
   FileSystemName:=_FileSystemName;
   Result:=True;
 End else Result:=False;
End;
end.


Пример использования:

Код
USES ..., ..., ..., HDDInfo; {Добавляем наш модуль}

{Нужно создать на форме компонент TLabel , Name которого ставим в Disks}
{И в событии главной формы OnActicate написать это:}

procedure TMyForm.FormActivate(Sender: TObject);
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;
Disks.Caption:=SOut; {Выводим в компонент TLabel полученные данные о дисках}
end;



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Dayana
Дата 12.3.2003, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



AntonSaburov, спасибо, посмотрю!

Pegas, но это все относится к логическим дискам.

serious, типа этого...

Например у меня есть 2 жестких диска, один Maxtor объемом 20 Gb и второй WD объемом 15Gb. Первый (Maxtor) разбила на 3 патиции: C, D, E соответственно 10Gb, 4Gb, 6Gb. Второй оставила с одной патицией F. Тем кодом, который привел serious и Pegas, можно получить информацию о том, что у меня в системе есть логические диски C, D, E, F их серийные номера, их объем. А у меня задача узнать сколько винчестеров у меня стоит, т.е. узнать о том, что у меня стоит 2 винчестера. Какие они, т.е., что это Maxtor и WD. Какой у них объем, т.е., что 20Gb и 15Gb. И на какие они патиции (логические диски) разбиты. А уже информацию по логическим дискам можно получить кодом приведенным выше Pegasом и seriousом.

Чтобы совсем было понятно: зайдите в Control Panel - Administrative tools - Computer management - Storage - Disk management. Вот в таком виде информацию...

Это сообщение отредактировал(а) Dayana - 12.3.2003, 18:42
PM MAIL ICQ   Вверх
Dayana
Дата 12.3.2003, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



AntonSaburov, похоже, это то, что мне надо... Спасибо! :-)
PM MAIL ICQ   Вверх
AntonSaburov
Дата 12.3.2003, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Цитата(Dayana @ 13.3.2003, 00:36)
AntonSaburov, похоже, это то, что мне надо... Спасибо! :-)

Ну, я, это, типа, завсегда, мы ж понимаем ... inlove.gif
Вот biggrin.gif

PM MAIL WWW ICQ   Вверх
Dayana
Дата 13.3.2003, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



AntonSaburov, только это работает для NT, а для 95/98 не работает... :-(
Есть ли какой-нибудь способ добраться до информации BIOSа? (для всех систем) Ведь BIOS видит диски.
PM MAIL ICQ   Вверх
serious
Дата 14.3.2003, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



А что конкретно под NT не работает? Все? Попробую под XP это сделать, если не пойдет, то будем думать дальше.


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
AntonSaburov
Дата 14.3.2003, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Цитата
только это работает для NT, а для 95/98 не работает... :-(


Я уже очень давно не работаю под такими ОС - предпочитаю с ними не связываться.
Так что здесь мало что могу посоветовать.

Но с другой стороны эти ОС дырявые и можно что-то с прямым доступом к памяти поискать.
PM MAIL WWW ICQ   Вверх
Dayana
Дата 16.3.2003, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



serious, для NT все работает. Читай внимательнее...

AntonSaburov, у меня просто задача для разных ОС. Поискать можно... вот и ищу... :-)
PM MAIL ICQ   Вверх
serious
Дата 16.3.2003, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Цитата(Dayana @ 13.3.2003, 15:39)
Есть ли какой-нибудь способ добраться до информации BIOSа? (для всех систем) Ведь BIOS видит диски.

Assembler?
ЗЫ А вообще, посмотри, не равен ли у тебя 0 дескриптор винта.


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
serious
Дата 16.3.2003, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Цитата(Dayana @ 13.3.2003, 15:39)
AntonSaburov, только это работает для NT, а для 95/98 не работает... :-(

Если ничего не путаю, там немного другой способ получения дескриптора.


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Dayana
Дата 16.3.2003, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



serious, а какой?
PM MAIL ICQ   Вверх
serious
Дата 17.3.2003, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Может так попробовать:

Код

procedure TMainForm.btnGetHandleClick(Sender: TObject);
var
 DriveHandle : HWND;
begin
 case Win32Platform of
 VER_PLATFORM_WIN32_NT:
   begin
     DriveHandle := CreateFile ('\\.\Scsi0:', GENERIC_READ+GENERIC_WRITE,
                                FILE_SHARE_READ+FILE_SHARE_WRITE, nil,
                                OPEN_EXISTING, 0, 0);
     if DriveHandle <> INVALID_HANDLE_VALUE then
       MessageBox (MainForm.Handle, PChar(IntToStr(DriveHandle)),
                   PChar('Here is your handle:'), MB_ICONINFORMATION)
     else
       MessageBox (MainForm.Handle, PChar('Error!'), PChar('Error'),
                   MB_ICONERROR);
   end;

 VER_PLATFORM_WIN32_WINDOWS:
   begin
     DriveHandle := CreateFile ('\\.\SMARTVSD', 0, 0, nil,
                                CREATE_NEW, 0, 0 );
     if DriveHandle <> INVALID_HANDLE_VALUE then
       MessageBox (MainForm.Handle, PChar(IntToStr(DriveHandle)),
                   PChar('Here is your handle:'), MB_ICONINFORMATION)
     else
       MessageBox (MainForm.Handle, PChar('Error!'), PChar('Error'),
                   MB_ICONERROR);
   end;

 end; // case
end;


Это сообщение отредактировал(а) serious - 17.3.2003, 03:09


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
serious
Дата 17.3.2003, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: нет
Всего: 1



Цитата(Dayana @ 12.3.2003, 10:33)
Например у меня есть 2 жестких диска, один Maxtor объемом 20 Gb и второй WD объемом 15Gb. Первый (Maxtor) разбила на 3 патиции: C, D, E соответственно 10Gb, 4Gb, 6Gb. Второй оставила с одной патицией F. Тем кодом, который привел serious и Pegas, можно получить информацию о том, что у меня в системе есть логические диски C, D, E, F их серийные номера, их объем. А у меня задача узнать сколько винчестеров у меня стоит, т.е. узнать о том, что у меня стоит 2 винчестера. Какие они, т.е., что это Maxtor и WD. Какой у них объем, т.е., что 20Gb и 15Gb. И на какие они патиции (логические диски) разбиты. А уже информацию по логическим дискам можно получить кодом приведенным выше Pegasом и seriousом.

Чтобы совсем было понятно: зайдите в Control Panel - Administrative tools - Computer management - Storage - Disk management. Вот в таком виде информацию...

Ну дык надо проверять название каждого винта или их серийные номера, тогда сможешь отличить один от другого. Иных путей не вижу, так что высылаю example, как все это сделать.


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Dayana
Дата 17.3.2003, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



serious, спасибо большое за пример... но я уже сама разобралась... :-)

Это сообщение отредактировал(а) Dayana - 17.3.2003, 22:19
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.