Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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