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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обём диска 
:(
    Опции темы
Sergey89
Дата 30.11.2004, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как определить V-жёсткого диска и оставшийся V-диска.
Не раздела, а диска!
--------------------
mlib.com.ru
PM MAIL   Вверх
p0s0l
Дата 30.11.2004, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



В NT'ях можно через CreateFile ('\\.\PhysicalDrive0', ... ) (вместо нуля ставь что надо)... А потом DeviceIoControl (hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY, ...)
В MSDN даже есть пример для этого, правда на Сях, но смысл понятен:
Код

BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
 HANDLE hDevice;               // handle to the drive to be examined
 BOOL bResult;                 // results flag
 DWORD junk;                   // discard results

 hDevice = CreateFile("\\\\.\\PhysicalDrive0",  // drive to open
                   0,                // no access to the drive
                   FILE_SHARE_READ | // share mode
                   FILE_SHARE_WRITE,
                   NULL,             // default security attributes
                   OPEN_EXISTING,    // disposition
                   0,                // file attributes
                   NULL);            // do not copy file attributes

 if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
 {
   return (FALSE);
 }

 bResult = DeviceIoControl(hDevice,  // device to be queried
     IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
                            NULL, 0, // no input buffer
                           pdg, sizeof(*pdg),     // output buffer
                           &junk,                 // # bytes returned
                           (LPOVERLAPPED) NULL);  // synchronous I/O

 CloseHandle(hDevice);

 return (bResult);
}

int main(int argc, char *argv[])
{
 DISK_GEOMETRY pdg;            // disk drive geometry structure
 BOOL bResult;                 // generic results flag
 ULONGLONG DiskSize;           // size of the drive, in bytes

 bResult = GetDriveGeometry (&pdg);

 if (bResult)
 {
   printf("Cylinders = %I64d\n", pdg.Cylinders);
   printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
   printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
   printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);

   DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
     (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
   printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
          DiskSize / (1024 * 1024));
 }
 else
 {
   printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
 }

 return ((int)bResult);
}
Можно юзать также IOCTL_DISK_GET_LENGTH_INFO - это сразу возвратит объём винта в байтах...




--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 30.11.2004, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Перенесенно из раздела Delphi


--------------------
С уважением, г-н Посол.
PM   Вверх
Sergey89
Дата 1.12.2004, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может, кто с C на Delphi переведёт?
--------------------
mlib.com.ru
PM MAIL   Вверх
p0s0l
Дата 1.12.2004, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Код
function GetDriveSize (DriveNo : byte) : Int64;
var
 hDrive : THandle;
 Size : Int64;
 Tmp : Cardinal;

begin
 Result := 0;
 hDrive := CreateFile (PChar('\\.\PhysicalDrive' + Char(DriveNo + Ord('0'))),
                       GENERIC_READ,
                       FILE_SHARE_READ or FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       0,
                       0);
 if hDrive = INVALID_HANDLE_VALUE then Exit;

 Tmp := SizeOf(Size);
 Size := 0;
 if DeviceIoControl (hDrive, $7405C,
                     nil, 0,
                     @Size, SizeOf(Size), Tmp,
                     nil) then Result := Size;
                     
 CloseHandle (hDrive);
end;
Если возвращает -1, то произошла ошибка (нет устройства с таким №)...

Пример использования:
Код
 ShowMessage (FloatToStr(GetDriveSize(0)/(1024*1024*1024)) + ' Gb');



--------------------
С уважением, г-н Посол.
PM   Вверх
Sergey89
Дата 1.12.2004, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А оставшееся место?
--------------------
mlib.com.ru
PM MAIL   Вверх
p0s0l
Дата 2.12.2004, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Надо сложить пустое место всех разделов жесткого диска + неразмеченная часть диска...

( smile )


--------------------
С уважением, г-н Посол.
PM   Вверх
Sergey89
Дата 2.12.2004, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дак, как предугадать сколько и как называются разделы?
--------------------
mlib.com.ru
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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