• ベストアンサー

(Win32)ファイルパスから物理ドライブ番号を取得するには

 任意のファイルが保存されているディスクの固有情報を取得するプログラムを作成しています。固有情報は論理ディスクでは取得できないため、「C:\sample.txt」の「C:」といった論理ドライブ名から「PHYSICALDRIVE0」のような物理ドライブ名を取得する方法を探しています。 なお開発環境はVisual C++ 2008/Win32 SDKの組み合わせとなります。

質問者が選んだベストアンサー

  • ベストアンサー
  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.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")); ----------------

Tank2005
質問者

お礼

 WMIに関する情報を検索することで、DeviceIoControlとIOCTL_STORAGE_QUERY_PROPERTYの組み合わせでも番号を取得できることがわかりました。ご回答いただき、ありがとうございます。

関連するQ&A

  • 物理ドライブの全容量を取得する方法

    現在、HDDを物理的に読み書きするソフトウェアを製作しております。 その際HDDをドライブレターではなく物理ドライブ番号で判断する必要があり、 全容量を取得する方法がわからず困っています。 環境はWindows2000Pro(VisualC++ V6/API)です。 ドライブレターが使用できる場合GetDiskFreeSpace(Ex)にて取得できるようですが、 試しに第一引数に「\\.\PhysicalDrive0」と渡し失敗することを確認しました。 指定方法や順序の問題かも知れませんが、 この状態でフォーマットされていないHDDの全容量を知る方法があれば、是非、ご教示ください。

  • 物理ドライブは認識されますが論理ドライブが見えません。Windows

    物理ドライブは認識されますが論理ドライブが見えません。Windows XPで使用していたHDです。マイコンピュータのディスク管理では不明なドライブとされ「初期化されていません。」とでています。ファイナルデータを使用しても物理ドライブは見えますが論理ドライブは見えません。ファイナルデータ9.0で「ドライブが正常に認識できない場合」のボタンをクリックするとGeneric Void Disk 9.02と表示が出てこれをクリックしてもディスクのスキャンは始まりません。このようなHDは回復させることができるのでしょうか。 またはフォーマッターであらためて初期化できるのでしょうか。 また初期化されたとしてその後ファイナルデータでファイルの復元ができますでしょうか。

  • ファイルパスが取得出来ない(Properties.getProperty使用)

    PropertiesクラスのgetPropertyメソッドを利用して 外部ファイルより値を取得しようとしています。 // ファイルパスの取得 java.util.Properties pr = new Properties(); pr.load(new FileInputStream("sample.properties")); String filePath = pr.getProperty("filePath"); fis.close(); // sample.properties filePath = C:\test\test.txt しかし、エスケープ記号?が問題で下記のようになり うまく取得出来ません。 filePath = C: est est.txt なぜこのような現象が起こるのでしょうか。 また、回避策はありますでしょうか。 よろしくお願いします。

  • HDDの物理ドライブが表示されない

    NEC PC-MA25VBZ1TSJBのPCのことで質問させていただきます。 OSはWINXPPROSP3です。デフラグをしようとすると「ディスクデフラグツールを開始できませんでした」の警告でるので、ディスクの管理を表示させるとCドライブとDドライブの物理ドライブだけが表示されません。 仮想ドライブは表示されます。CとDの論理ドライブはありますのでPCの使用には問題がありません。ただデフラグやパーティション操作やHDDのバックアップができないので困っています。 HDDに問題があるのかと思いchkdskをしても異常はありませんでいた。CD革命をインストしていますので仮想ドライブ作成ソフトに問題があるのではと思い削除しても変化ありませんでした。 何が、原因なのか教えてください。

  • バッチ(win系)内でのファイル名の取得方法

    こんにちは。 バッチ内で日々動的に変わるファイル名の取得で困っています。 動的に変わるファイル名というのは日付付のファイル名です。 例) 041208_sample.txt 例えば、とあるフォルダ(a)には 041206_sample.txt 041207_sample.txt 041208_sample.txt と複数ファイルがあり、あるシステムから送付されるファイル(date.txt)の内容が"20041208"だった場合に041208_sample.txt(注 20041208_sample.txtでない)を 別なフォルダ(b)に複写するという事を行いたいのです。 仮にファイル名の日付の桁数が「041208」でなく20041206_sample.txtだった場合のバッチコーディング例は for /F %%i in ( date.txt ) do set TXTDATE=%%i copy a\%TXTDATE%_sample.txt b とできるのですが、、、、どのようなテクニックが必要でしょうか? ちなみに動作環境はwindowsNTを使用しております。 よろしくお願いします。

  • ファイルパス操作について

    いつもお世話になっております。 今回はパス操作についてお聞きしたいことが有ります。 例えば C:\hoge1\hoge2\hoge3\hoge.txt のようなパスが合ったとして、ファイル名を取りたいときは ::PathRemoveFileSpecで可能ですが、 C:\hoge1まで切り出したいとき、 現在上記APIを3度呼んで実装しています。 char sz = {"C:\hoge1\hoge2\hoge3\hoge.txt"}; ::PathRemoveFileSpec(sz); ::PathRemoveFileSpec(sz); ::PathRemoveFileSpec(sz); これでsz=C:\hoge1になる このような感じで実現は出来るのですが、スマートでは無いと感じております。 もっといい方法がありましたら教えてください。 よろしくお願いします。 環境は window7 professional visual studio 2008 MFC未使用です。

  • ドライブ名の取得について

    VB初心者です。 すごく基礎的なことで恥ずかしいんですが どうにもわからないのでご教示ください。 m(__)m ドライブ直下にあるファイルの入出力処理をやりたいのです。 ドライブは「ドライブリストボックス」を使ってドライブ名を選択できるようにしたいのですが ハードディスクのドライブ名が  ”c:[windows]” のようになってしまうのを防ぐ方法はないでしょうか? 単純に”c:” ”d:”のようにドライブ名だけ 表示・取得したいのですが… 方法をご存知の方、ご教示ください。 よろしくお願いします。

  • Kinectで口の座標を取得するプログラム

    どなたかkinectで口の座標を取得する簡易プログラムを教えてください。 visual c++ 2010 express kinect for windows sdk 1.6

  • ディスプレイ番号取得API(C++)

    デュアルディスプレイで、Windowsの「画面の解像度」でのディスプレイ番号を、 アプリ上で取得し、ディスプレイを制御したいです。 ディスプレイ情報取得は、「EnumDisplayMonitors」と「GetMonitorInfo」のAPIを用いています。 「GetMonitorInfo」で取得できる、「szDevice(ディスプレイ名)」はディスプレイ番号とは異なるため、使えませんでした。 情報が足りないかも知れませんが、よろしくお願いします。 開発環境:Visual Studio 2005 言語:C++ 動作環境:Windows 7

  • ドキュメントをCドライブからDドライブへ移動後にCドライブの方が削除できない

    先日新しいパソコンを買い、リカバリーディスクでDドライブを作りました。 その後Cドライブのユーザー名の中にある、ドキュメントなどの11個のフォルダをDドライブに移動させたのですが、 サンプルデータの入っている、ミュージックとピクチャとビデオの3つはCドライブに残ってしまい、 削除しようとすると、 「別のプログラムがこのフォルダを開いているので、操作を実行できません」 というメッセージが出て削除できません。 Cドライブに残ったフォルダ内には何も入っておらず、サンプルデータはDドライブの方にはいっており、場所もDドライブになっています。 (買ったばかりなのでサンプルデータしかありません) どなたかわかる方お願いします。

専門家に質問してみよう