6 votes

Liste de tous les lecteurs physiques (Windows)

Comment puis-je obtenir tous les chemins d'accès aux lecteurs physiques ( \\.\PhysicalDriveX ) sur un ordinateur Windows, avec C/C++ ?

Les réponses dans cette La question suggère d'obtenir la lettre du lecteur logique, puis le lecteur physique correspondant à ce lecteur monté. Le problème est que je veux obtenir todos les lecteurs physiques connectés à l'ordinateur, y compris les lecteurs qui ne sont pas montés.

D'autres réponses suggèrent d'incrémenter une valeur de 0 à 15 et de vérifier si un lecteur existe à cet endroit ( \\.\PhysicalDrive0 , \\.\PhysicalDrive1 ...) ou en appelant le WMIC pour obtenir la liste de tous les lecteurs[

Bien que ces mesures semblent fonctionner, elles ne semblent pas être la meilleure approche à adopter. N'existe-t-il pas une fonction simple telle que GetPhysicalDrives qui renvoie simplement un vecteur de std::string contenant les chemins d'accès de tous les lecteurs physiques ?

5voto

Jerry Coffin Points 237758

Vous pouvez utiliser QueryDosDevice . D'après la description, on pourrait s'attendre à ce que la liste contienne des éléments tels que C: y D: mais il énumère également des éléments tels que PhysicalDrive0 , PhysicalDrive1 et ainsi de suite.

Le principal inconvénient est qu'il énumère également un grand nombre d'autres noms de périphériques dont vous ne vous souciez probablement pas. Ainsi (par exemple), sur ma machine, j'obtiens une liste de près de 600 noms de périphériques, dont seul un pourcentage relativement faible est lié à ce qui vous intéresse.

Au cas où cela vous intéresserait, voici un (vieil) exemple de code :

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

Cependant, si j'exécute cette commande comme `devlist | grep "^Physical", la liste des lecteurs physiques s'affiche.

-1voto

henryJack Points 1113

Oui, vous pouvez simplement taper NET USE . Voici un exemple de sortie...

NET USE
New connections will be remembered.

Status       Local     Remote                    Network

-------------------------------------------------------------------------------
             H:        \\romaxtechnology.com\HomeDrive\Users\Henry.Tanner
                                                Microsoft Windows Network
OK           N:        \\ukfs01.romaxtechnology.com\romaxfs
                                                Microsoft Windows Network
OK           X:        \\ukfs03.romaxtechnology.com\exchange
                                                Microsoft Windows Network
OK           Z:        \\ukfs07\Engineering      Microsoft Windows Network
                       \\romaxtechnology.com\HomeDrive
                                                Microsoft Windows Network
OK                     \\ukfs07\IPC$             Microsoft Windows Network
The command completed successfully.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X