ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:Tank2005 (Win32)ファイルパスから物理ドライブ番号を取得するには
困り度:
  • 困っています
 任意のファイルが保存されているディスクの固有情報を取得するプログラムを作成しています。固有情報は論理ディスクでは取得できないため、「C:\sample.txt」の「C:」といった論理ドライブ名から「PHYSICALDRIVE0」のような物理ドライブ名を取得する方法を探しています。

なお開発環境はVisual C++ 2008/Win32 SDKの組み合わせとなります。
質問投稿日時:08/03/28 17:03
質問番号:3902403
この質問に対する回答は締め切られました。

回答

良回答20pt

回答者:x415f484f 方法 (1)

WMI ( Windows Management Instrumentation ) を使ってこれらを
関連付けする方法はどうでしょうか?

WQL 文
SELECT * from Win32_LogicalDiskToPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
Dependent: \\hostname\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
(略)

WQL 文
SELECT * from Win32_DiskDriveToDiskPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
Dependent: \\hostname\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
(略)

WMI を VC++ からお使いに方法については以下の URL をご参照ください。

WMI C++ Application Examples (Windows)
http://msdn2.microsoft.com/en-us/library/aa394558.aspx

WQL (SQL for WMI) (Windows)
http://msdn2.microsoft.com/en-us/library/aa394606.aspx

CodeProject Making WMI Queries In C++. Free source code and programming help
http://www.codeproject.com/KB/system/UsingWMI.aspx


方法 (2)

ドライブ情報を取得するツールがベクターにあり、この方法は WMI を使いません。
ソースも同梱されています。
volumeinfo displays the Volume Infomations.
http://www.vector.co.jp/soft/dl/winnt/util/se328137.html
※ \\.\PHYSICALDRIVE0 ではなく WIN32API の QueryDosDevice で
  取得できる \Device\HardDiskVolume0 ですが。


蛇足にしかなりませんが。
CLI を使ったマネージドコードならこれだけで呼び出すことが可能です。
※ 処理に時間がかかります。
----------------
// 参照追加 System.Management
// using namespace System::Management;
System::String^ logdrv_to_phydev(System::String^ drive)
{
System::String^ strClassName = "Win32_LogicalDisk='" + drive->Trim()->Substring(0,1) + ":'";
ManagementObject^ mo = gcnew ManagementObject(strClassName);
for each (ManagementObject^ mo1 in mo->GetRelated("Win32_DiskPartition"))
{
for each (ManagementObject^ mo2 in mo1->GetRelated("Win32_Diskdrive"))
return mo2["Name"]->ToString();
}
}
----------------
// 呼出例
// 結果: \\.\PHYSICALDRIVE0
Console::WriteLine(logdrv_to_phydev("C"));
----------------
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/03/29 04:56
回答番号:No.1
この回答へのお礼 WMIに関する情報を検索することで、DeviceIoControlとIOCTL_STORAGE_QUERY_PROPERTYの組み合わせでも番号を取得できることがわかりました。ご回答いただき、ありがとうございます。