Как я могу получить все пути к физическим дискам (\\. \ PhysicalDriveX) на компьютере с Windows, с C / C ++?
Ответы в этот вопрос предлагает получить букву логического диска, а затем получить физический диск, соответствующий этому подключенному диску. Проблема в том, что я хочу получить все
физические диски, подключенные к компьютеру, включая диски, которые не смонтированы.
Другие ответы предлагают увеличить значение от 0 до 15 и проверить, существует ли там диск (\\. \ PhysicalDrive0, \\. \ PhysicalDrive1, …) или вызвать WMIC для получения списка всех дисков. [
Похоже, что они будут работать, они кажутся не лучшим подходом. Разве нет такой простой функции, как GetPhysicalDrives
который просто возвращает вектор std::string
Содержит пути всех физических дисков?
Ты можешь использовать QueryDosDevice
, Основываясь на описании, вы ожидаете, что это перечислит такие вещи, как C:
а также D:
, но он также перечисляет такие вещи, как PhysicalDrive0
, PhysicalDrive1
и так далее.
Основным недостатком является то, что в нем также будут перечислены многие другие имена устройств, которые вам, вероятно, не нужны, поэтому (например) на моей машине я получаю список из почти 600 имен устройств, из которых только довольно небольшой процент составляет связано с тем, что вы заботитесь.
На всякий случай, какой-то (старый) пример кода:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
int main(int argc, char **argv) {
char physical[65536];
char logical[65536];
if ( argc > 1) {
for (int i=1; i<argc; i++) {
QueryDosDevice(argv[i],logical, sizeof(logical));
std::cout << argv[i] << " : \t" << logical << std::endl << std::endl;
}
return 0;
}
QueryDosDevice(NULL, physical, sizeof(physical));
std::cout << "devices: " << std::endl;
for (char *pos = physical; *pos; pos+=strlen(pos)+1) {
QueryDosDevice(pos, logical, sizeof(logical));
std::cout << pos << " : \t" << logical << std::endl << std::endl;
}
return 0;
}
Однако, если я запустлю это как `devlist | grep «^ Physical», это список физических дисков.
Других решений пока нет …