Как получить размер жесткого диска в байтах в Windows 2000?
Как я могу получить точный размер жесткого диска в байтах на старой Windows 2000?
IOCTL_DISK_GET_LENGTH_INFO отлично работает для томов, но не на дескрипторах физических дисков (например, //./PHYSICALDISKx) в Windows 2000. (Отлично работает для физических дисков от XP или новее)
Мы все еще должны поддерживать эту древнюю ОС...
ОБНОВИТЬ:
Код написан на C, поэтому я бы использовал простой Windows API, если это возможно.
3 ответа
Похоже, что в Windows 2000 нет IOCTL, который бы точно указывал размер жесткого диска.
Но есть обходной путь, который работал:
Я использовал IOCTL_DISK_GET_DRIVE_GEOMETRY, чтобы получить цилиндры, дорожки / цилиндры, сектора / дорожки, байты / сектора.
Умножение их дало мне приблизительный размер жесткого диска, но не точный размер (чуть меньше). Я могу рассчитать почти последний идентификатор сектора из этого.
Чтобы получить точный размер, я использовал IOCTL_SCSI_PASS_THROUGH и отправил команды чтения SCSI, чтобы попытаться выполнить чтение за пределами конца диска, поэтому у меня был номер сектора для несуществующего сектора, затем я использовал бинарный поиск, чтобы получить наибольший идентификатор сектора, где чтение было успешным.
Умножая его на байты / сектор, я получаю точный размер жесткого диска в байтах.
Вы можете получить свободное место в C (без каких-либо API и т. Д.)
Если вы бежитеdir c:\
", последняя строка даст вам свободное место на диске.
Лучшее решение: "fsutil volume diskfree c:
"
Или попробуйте следующий код...
void main (int argc, wchar_t **argv)
{
BOOL fResult;
unsigned __int64 i64FreeBytesToCaller,
i64TotalBytes,
i64FreeBytes;
fResult = GetDiskFreeSpaceEx (L"C:",
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
if (fResult)
{
printf ("\n\nGetDiskFreeSpaceEx reports\n\n");
printf ("Available space to caller = %I64u MB\n",
i64FreeBytesToCaller / (1024*1024));
printf ("Total space = %I64u MB\n",
i64TotalBytes / (1024*1024));
printf ("Free space on drive = %I64u MB\n",
i64FreeBytes / (1024*1024));
}
}
Всякий раз, когда мне нужно получить информацию такого типа, я обычно использую WMI, поскольку она предоставляет множество данных практически обо всем.