■82538 / inTopicNo.7) |
Re[5]: ドライブが同じストレージに属するか調べる方法 |
□投稿者/ 魔界の仮面弁士 (1056回)-(2017/01/14(Sat) 16:40:59)
|
■No82531 (イカ太郎 さん) に返信 > http://stackoverflow.com/questions/9346320/wmi-to-get-drive-letter-association-with-physical-drive-path-misses-cdroms > このページの方法で所望することができました。 > しかしWMIを使った方がもっとスマートにできるのでしょうか?
そのページの前半に書かれているのが、WMI を使った方法ですよ。 Win32_LogicalDiskToPartition クラスから辿るコードになっています。
後半には FileSystemObject を使った例がありますが、これだと今回の目的は満たせ無いでしょうし。
そのページで紹介されている WMI のコードは、 VBA から COM ベースで呼び出しているコードになっています。 VB.NET でも同じようにかけますが、マネージクラスの方が良いでしょう。
直接 System.Management.ManagementObject などを利用しても良いのですが、 ここでは型付き WMI オブジェクト(MgmtClassGen)を利用したコードで書いてみます。
Imports ROOT.CIMV2.Win32 Module Module1 Sub Main() Dim q = From map As LogicalDiskToPartition In LogicalDiskToPartition.GetInstances() Select New LogicalDisk(map.Dependent).Name, New DiskPartition(map.Antecedent).DiskIndex
For Each o In q Console.WriteLine("{0} はディスク#{1}にあります。", o.Name, o.DiskIndex) Next End Sub End Module
出力結果は、たとえば下記のようになります。
C: はディスク#0にあります。 D: はディスク#0にあります。 E: はディスク#1にあります。
LINQ を使わない場合は、こんな感じになります。 ついでに Dispose も明示しておきます。
'http://www.wmifun.net/library/win32_logicaldisktopartition.html For Each map As LogicalDiskToPartition In LogicalDiskToPartition.GetInstances() Dim partition As New DiskPartition(map.Antecedent) 'Win32_DiskPartition Dim logicalDisk As New LogicalDisk(map.Dependent) 'Win32_LogicalDisk
Console.WriteLine(logicalDisk.Name & " → " & partition.DeviceID)
'Console.WriteLine(" Name = {0}", logicalDisk.Name) 'Console.WriteLine(" Volume = {0}", logicalDisk.VolumeName) 'Console.WriteLine(" FileSystem = {0}", logicalDisk.FileSystem) 'Console.WriteLine(" Size = {0}", If(logicalDisk.IsSizeNull, "", logicalDisk.Size)) 'Console.WriteLine(" FreeSpace = {0}", If(logicalDisk.IsFreeSpaceNull, "", logicalDisk.FreeSpace)) 'Console.WriteLine(" Disk = {0}", partition.DiskIndex) 'Console.WriteLine(" Partition = {0}", partition.Index)
logicalDisk.Dispose() partition.Dispose() map.Dispose() Next
ただし上記の方法だと、ドライブレターが割り当てられていないパーティションの Win32_DiskPartition を拾えません。未割当のパーティションも調査したい場合は、 Win32_LogicalDiskToPartition => Win32_LogicalDisk と辿るのではなく、 Win32_DiskDriveToDiskPartition => Win32_DiskDrive と辿ります。
'Win32_LogicalDiskToPartition を列挙 For Each map As DiskDriveToDiskPartition In DiskDriveToDiskPartition.GetInstances() Dim drive As New DiskDrive(map.Antecedent) 'Win32_DiskDrive Dim partition As New DiskPartition(map.Dependent) 'Win32_DiskPartition
Console.WriteLine(partition.Name)
'Console.WriteLine("Drive DeviceID = {0}", drive.DeviceID) 'Console.WriteLine("Drive Name = {0}", drive.Name) 'Console.WriteLine("Drive Caption = {0}", drive.Caption) 'Console.WriteLine("Drive Index = {0}", drive.Index) 'Console.WriteLine("Drive InterfaceType = {0}", drive.InterfaceType) 'Console.WriteLine("Drive MediaType = {0}", drive.MediaType) 'Console.WriteLine("Drive Manufacturer = {0}", drive.Manufacturer) 'Console.WriteLine("Drive Model = {0}", drive.Model) 'Console.WriteLine("Drive SerialNumber = {0}", drive.SerialNumber)
'Console.WriteLine(" Partition DeviceID = {0}", partition.DeviceID) 'Console.WriteLine(" Partition Name = {0}", partition.Name) 'Console.WriteLine(" Partition Caption = {0}", partition.Caption) 'Console.WriteLine(" Partition Index = {0}", partition.Index) 'Console.WriteLine(" Partition DiskIndex = {0}", partition.DiskIndex) 'Console.WriteLine(" Partition Type = {0}", partition.Type)
drive.Dispose() partition.Dispose() map.Dispose() Next
|
|