列出所有物理驱动器(Windows)

Listing All Physical Drives (Windows)

本文关键字:Windows 驱动器 所有物      更新时间:2023-10-16

如何在Windows计算机上使用C/c++获得所有物理驱动器路径(\.PhysicalDriveX) ?

这个问题的答案建议获得逻辑驱动器号,然后获得与该挂载驱动器对应的物理驱动器。问题是,我想要得到all已连接到计算机的物理驱动器,包括未挂载的驱动器。

其他答案建议从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",它会列出物理驱动器。

是的,你可以直接输入NET USE。下面是一个示例输出…

NET USE
New connections will be remembered.

Status       Local     Remote                    Network
-------------------------------------------------------------------------------
             H:        \romaxtechnology.comHomeDriveUsersHenry.Tanner
                                                Microsoft Windows Network
OK           N:        \ukfs01.romaxtechnology.comromaxfs
                                                Microsoft Windows Network
OK           X:        \ukfs03.romaxtechnology.comexchange
                                                Microsoft Windows Network
OK           Z:        \ukfs07Engineering      Microsoft Windows Network
                       \romaxtechnology.comHomeDrive
                                                Microsoft Windows Network
OK                     \ukfs07IPC$             Microsoft Windows Network
The command completed successfully.