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

7
如何使用C/C++在Windows计算机上获取所有物理驱动器路径(\\.\PhysicalDriveX)?
问题的答案中,建议获取逻辑驱动器字母,然后获取对应于该挂载驱动器的物理驱动器。问题在于,我想要获取连接到计算机的所有物理驱动器,包括未挂载的驱动器。
其他答案建议从0-15增加一个值,然后检查是否存在驱动器(\\.\PhysicalDrive0、\\.\PhysicalDrive1等),或调用WMIC列出所有驱动器。
虽然这些方法似乎可行,但它们不是最佳方法。难道没有一个简单的函数,例如GetPhysicalDrives,仅返回包含所有物理驱动器路径的std::string向量吗?

1
你是否查看过 boost::filesystem 是否能帮助你? - AxelOmega
我还没有研究过 boost。如果不出现需要另一个库的答案,我会尽快查看它。 - hetelek
逻辑驱动器存在于已挂载或未挂载的驱动器上...您仍然关注没有任何逻辑驱动器(已识别分区)的物理磁盘,这是一个有效的问题。 - Ben Voigt
2个回答

5
您可以使用 QueryDosDevice。根据描述,您期望它列出像 C:D: 这样的内容,但它也会列出像 PhysicalDrive0PhysicalDrive1 等等的内容。
主要缺点是它也会列出许多其他设备名称,这些名称可能与您不相关(例如,在我的计算机上,我得到了近 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"`,它会列出物理驱动器。

我本来是为了另一个完全不同的任务而需要这个,但这是我找到的使用QueryDosDevice的最好例子;向您致敬。 - CommanderBubble

-2

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

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.


网络/UNC路径与本地附加的物理存储设备路径无关。 - Ben Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接