2013-03-11 12 views
5

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

回答はthisです。論理ドライブ文字を取得し、そのマウントされたドライブに対応する物理ドライブを取得することをお勧めします。問題は、マウントされていないドライブを含め、すべて 物理ドライブがコンピュータに接続されている状態です。

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

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

+1

'boost :: filesystem'があなたを助けることができましたか? – AxelOmega

+0

私はまだ 'boost'を見ていません。すぐに別の図書館を必要としない答えが出てこない場合は、それを見ていきます。 – hetelek

+0

論理ドライブのドライブ文字は、マウントされているかどうかにかかわらず存在します。論理ドライブ(認識されたパーティション)を持たない物理ディスクについては、依然として懸念があります。 –

答えて

4

QueryDosDeviceを使用できます。この説明に基づいて、C:D:のようなものをリストすることが期待されますが、PhysicalDrive0PhysicalDrive1のようなものもリストされます。

大きな欠点は、おそらく気にしない他の多くのデバイス名もリストに表示されることです(例えば、私のマシン上では、私は約600のデバイス名のリストを取得します。かなり小さいパーセンテージはあなたが気にするものに関連しています。あなたは、いくつかの(古い)のサンプルコードを気に念のために

:私は `devlistのようにこれを実行する場合、しかし、

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

を| grep "^ Physical"、物理ドライブの一覧を表示します。

+0

は完全に別のタスクでこれを望んでいましたが、これはQueryDosDeviceの使い方の例です。 +1あなたのために。 – CommanderBubble