- ベストアンサー
(Win32)ファイルパスから物理ドライブ番号を取得するには
任意のファイルが保存されているディスクの固有情報を取得するプログラムを作成しています。固有情報は論理ディスクでは取得できないため、「C:\sample.txt」の「C:」といった論理ドライブ名から「PHYSICALDRIVE0」のような物理ドライブ名を取得する方法を探しています。 なお開発環境はVisual C++ 2008/Win32 SDKの組み合わせとなります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
方法 (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")); ----------------
お礼
WMIに関する情報を検索することで、DeviceIoControlとIOCTL_STORAGE_QUERY_PROPERTYの組み合わせでも番号を取得できることがわかりました。ご回答いただき、ありがとうございます。