15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Borland C++ Builder FAQ
Составлен по материалам форума на Исходниках.Ru
Содержание Последнее обновление: 14.02.2004

Получить список дисков и их параметры

Автор: OlegGG
Исходная ссылка: - - -

Эта функция выдаст информацию по всем дискам:
int n;
bool Flag;
DWORD dr = GetLogicalDrives(); // функция возвращает битовую маску

for(int x=0;x<26;x++) // проходимся циклом по битам
{
   n = ((dr>>x)&1); // узнаём значение текущего бита
   if(n) // если единица - диск с номером x есть
   {
	  AnsiString dl = AnsiString((char)(65+x)); // получаем литеру диска
	  AnsiString path = AnsiString((char)(65+x))+":\\";

	  AnsiString out = "Диск " + dl + "\n";

	  // здесь узнаём готово ли устройство
	  WORD OldErrorMode;
	  OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); // убираем показ ошибок
	  bool ready = DirectoryExists(path); // пытаемcя открыть корневую директорию
	  SetErrorMode(OldErrorMode); // восстанавливаем старый режим показа ошибок

	  if (ready)
	  {
		 UINT drive_type = GetDriveType((dl+":\\").c_str()); // узнаём тип диска
		 out += "\nТип диска: ";
		 if (drive_type == DRIVE_REMOVABLE) out += "REMOVABLE";
		 else if (drive_type == DRIVE_FIXED)	 out += "FIXED";
		 else if (drive_type == DRIVE_REMOTE)	out += "REMOTE";
		 else if (drive_type == DRIVE_CDROM)	 out += "CD-ROM";
		 else if (drive_type == DRIVE_RAMDISK)   out += "RAMDISK";
		 else out += "НЕИЗВЕСТНЫЙ_ТИП\n";

		 // если это HDD - заприашиваем информацию о нем
		 if (drive_type == DRIVE_FIXED)
		 {
			unsigned __int64 FreeBytesAvailable;
			unsigned __int64 TotalNumberOfBytes;
			unsigned __int64 TotalNumberOfFreeBytes;
			char drive_label[30];
			char drive_fat[30];
			DWORD drive_sn;
			DWORD drive_name_size = sizeof(drive_label);

			// получаем данные о размерах
			Flag = ::GetDiskFreeSpaceEx(path.c_str(),
						   (PULARGE_INTEGER)&FreeBytesAvailable,
						   (PULARGE_INTEGER)&TotalNumberOfBytes,
						   (PULARGE_INTEGER)&TotalNumberOfFreeBytes
						   );
			if (Flag)
			{
			   out += "\nСвободно на диске: " + AnsiString(TotalNumberOfFreeBytes) + "\n";
			   out += "Всего на диске: " + AnsiString(TotalNumberOfBytes) + "\n";
			}
			else
			{
			   out += "Ошибка в GetDiskFreeSpaceEx\n";
			}

			// получаем метку, серинийный номер и пр.
			Flag = GetVolumeInformation(path.c_str(),
						   drive_label,
						   sizeof(drive_label),
						   &drive_sn,
						   &drive_name_size,
						   NULL,
						   drive_fat,
						   sizeof(drive_fat)
						   );
			if (Flag)
			{
			   out += "\nМетка тома: " + AnsiString(drive_label) + "\n";
			   out += "Сер.номер: " + AnsiString(drive_sn) + "\n";
			   out += "Файловая система: " + AnsiString(drive_fat) + "\n";
			}
			else
			{
			   out += "Ошибка в GetVolumeInformation\n";
			}
		 }
	  }
	  else
	  {
		 out += "НЕ ГОТОВ";
	  }
	  ShowMessage(out);
   }
}