2013-03-11 13 views
5

Come posso ottenere tutti i percorsi fisici (\\. \ PhysicalDriveX) su un computer Windows, con C/C++?Listing All Physical Drives (Windows)

Le risposte nella domanda this suggeriscono di ottenere la lettera dell'unità logica, quindi di ottenere l'unità fisica corrispondente a quella unità montata. Il problema è che voglio ottenere tutte le unità fisiche collegate al computer, incluse le unità che non sono montate.

altre risposte suggeriscono di incrementare un valore 0-15 e controllando se esiste un'unità lì (\\. \ PHYSICALDRIVE0, \\. \ PhysicalDrive1, ...) o chiamando WMIC per elencare tutte le unità. [

Dato che sembrano funzionare, sembrano non essere l'approccio migliore da prendere. Non esiste una semplice funzione come GetPhysicalDrives che restituisce semplicemente un vettore di std::string contenente i percorsi di tutte le unità fisiche?

+1

Hai guardato se 'boost :: filesystem' può aiutarti? – AxelOmega

+0

Non ho ancora esaminato 'boost', no. Darò un'occhiata a questo se nessuna risposta che non richiede un'altra libreria non verrà presto. – hetelek

+0

Le lettere di unità esistono per le unità logiche sia montate che non ... si ha ancora una preoccupazione valida sui dischi fisici senza unità logiche (partizioni riconosciute). –

risposta

4

È possibile utilizzare QueryDosDevice. In base alla descrizione, ci si aspetterebbe che elencasse cose come C: e D:, ma elenca anche cose come PhysicalDrive0, PhysicalDrive1 e così via.

Il difetto principale è che elencherà anche molti altri nomi di dispositivi che probabilmente non ti interessano, quindi (ad esempio) sulla mia macchina, ottengo un elenco di quasi 600 nomi di dispositivi, di cui solo un una percentuale piuttosto piccola è legata a ciò che ti interessa.

Solo nel caso vi preoccupate, alcuni (vecchio) codice di esempio:

#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; 
}  

Tuttavia, se corro questo come `devlist | grep "^ Physical", elenca le unità fisiche.

+0

ha voluto questo per un compito completamente diverso, ma è l'esempio migliore che ho trovato su come utilizzare QueryDosDevice; +1 per te signore. – CommanderBubble