6

C / C ++を使用してWindowsコンピューターですべての物理ドライブパス(\\。\ PhysicalDriveX)を取得するにはどうすればよいですか?

この質問の答えは、論理ドライブ文字を取得してから、マウントされたドライブに対応する物理ドライブを取得することを提案しています。問題は、マウントされていないドライブを含め、すべての 物理ドライブをコンピューターに接続したいということです。

他の回答では、値を0〜15にインクリメントして、そこにドライブが存在するかどうかを確認するか(\\。\ PhysicalDrive0、\\。\ PhysicalDrive1、...)、WMICを呼び出してすべてのドライブを一覧表示することをお勧めします。[

これらは機能するように見えるので、最善のアプローチではないようです。すべての物理ドライブのパスを含むのGetPhysicalDrivesベクトルを返すような単純な関数はありませんか?std::string

4

2 に答える 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"、物理ドライブを一覧表示します。

于 2013-03-12T00:03:51.430 に答える
-1

Yes, you can just type NET USE. Here is an example output...

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.

于 2019-07-02T07:48:51.893 に答える