【问题标题】:Listing All Physical Drives (Windows)列出所有物理驱动器 (Windows)
【发布时间】:2013-02-27 08:11:17
【问题描述】:

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

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

其他答案建议从 0-15 递增一个值并检查那里是否存在驱动器(\\.\PhysicalDrive0、\\.\PhysicalDrive1、...)或调用 WMIC 以列出所有驱动器。[

由于这些似乎可行,它们似乎不是最好的方法。难道没有一个简单的函数,比如GetPhysicalDrives,它简单地返回一个包含所有物理驱动器路径的std::string的向量?

【问题讨论】:

  • 你看过boost::filesystem能不能帮到你?
  • 我还没有查看boost,没有。如果没有不需要另一个库的答案不会很快出现,我会看看。
  • 无论是否挂载,逻辑驱动器都存在驱动器号......您仍然对没有逻辑驱动器(可识别分区)的物理磁盘有充分的担忧。

标签: c++ c drives


【解决方案1】:

是的,您只需输入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 路径与本地连接的物理存储设备的路径无关。
【解决方案2】:

您可以使用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 的最佳示例; +1 先生。
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
相关资源
最近更新 更多