tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル物理ドライブ(指定ドライブ)情報を取得
記事No11655
投稿日: 2016/04/19(Tue) 18:27
投稿者食う寝る走る
開発環境
 OS:Windows7(32bit)プロフェッショナル
 IDE:VS2015 コミュニティ(VB.net)


Cドライブの情報を取得したく、
(1)http://blog.livedoor.jp/akf0/archives/51215179.html
(2)http://hanatyan.sakura.ne.jp/vb2005/vb2013drive05.htm
を参考にコードを考えましたが、下のコードでは、Cドライブ以外の情報も取得してしまいます。
下記コードを修正して(1)のようにCドライブだけの情報に出来ないでしょうか?


更に、(2)では
For Each wkProperty As PropertyData In Disk.Properties()
      Console.WriteLine(wkProperty.Name())
    Next

でプロパティを羅列するコードがありますが、羅列した結果をそのまま、使ってコード内に埋め込めれば、
Dim Str() As String = {"Name", "FileSystem", "FreeSpace", "Size", "VolumeName", "VolumeSerialNumber"}
のように、配列内であえて記述しなくて済むのですが、そのようにしてCドライブの情報を羅列するコードにするにはどのようにしたらよろしいでしょうか。

よろしくお願いいたします。


'---------------------------------------------------------------------------------------------
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Str() As String = {"Name", "FileSystem", "FreeSpace", "Size", "VolumeName", "VolumeSerialNumber"}
        Dim strMem As String '情報格納


        Dim mc As New ManagementClass("Win32_LogicalDisk")
        For Each i In Str
            For Each p In mc.GetInstances()
                strMem &= ($"Win32_LogicalDisk.{i}={p(i)}" & vbCrLf)
                p.Dispose()
        Next p, i

        MsgBox(strMem)

    End Sub

[ツリー表示へ]
タイトルRe: 物理ドライブ(指定ドライブ)情報を取得
記事No11656
投稿日: 2016/04/20(Wed) 00:03
投稿者魔界の仮面弁士
> Dim Str() As String
VB には「Str 関数」がありますよね。
予約語ではないにせよ、その名前は混乱の元かも。

それと、WMI は IDisposable なので、Dispose した方がベターです。


>         For Each i In Str
>             For Each p In mc.GetInstances()
外側と内側のループは逆にした方がよいと思いますよ。


ループしないならこんな感じ。

Using p As New ManagementObject($"Win32_LogicalDisk.DeviceId=""C:""")
    p.Get()

    strMem = $"Name={p!Name}
FileSystem={p!FileSystem}
FreeSpace={p!FreeSpace}
Size={p!Size}
VolumeName={p!VolumeName}
VolumeSerialNumber={p!VolumeSerialNumber}"

End Using


p("FreeSpace") とか p.Item("FreeSpace") とか
p.Properties("FreeSpace").Value でも良いですけど。



元のコードのように ManagementObjectCollection を使うなら、WQL にする手もありますよ。


Dim wql = "
SELECT
  Name, FileSystem, FreeSpace, Size,
  VolumeName, VolumeSerialNumber
FROM
  Win32_LogicalDisk
WHERE
  MediaType=12  OR  MediaType IS NULL
"

strMem = ""
Using mc = New ManagementObjectSearcher(wql), disks = mc.Get()
    For Each p In disks

        strMem &= $"
Name={p!Name}
FileSystem={p!FileSystem}
FreeSpace={p!FreeSpace}
Size={p!Size}
VolumeName={p!VolumeName}
VolumeSerialNumber={p!VolumeSerialNumber}
-----"

        p.Dispose()
    Next
End Using



ちなみに MediaType = 12 は、ドライブの種類が HDD(SSD) であるものを指しています。
ドライブ指定にしたいなら、WHERE DeviceId = 'C:' で抽出しておけば OK 。


    'winioctl.h
    Enum MEDIA_TYPE
        Unknown
        F5_1Pt2_512
        F3_1Pt44_512
        F3_2Pt88_512
        F3_20Pt8_512
        F3_720_512
        F5_360_512
        F5_320_512
        F5_320_1024
        F5_180_512
        F5_160_512
        RemovableMedia
        FixedMedia
    End Enum

[ツリー表示へ]
タイトルRe^2: 物理ドライブ(指定ドライブ)情報を取得 (解決)
記事No11657
投稿日: 2016/04/22(Fri) 19:23
投稿者食う寝る走る
>魔界の仮面弁士さま
アドバイスありがとうございます。

> > Dim Str() As String
> VB には「Str 関数」がありますよね。
> 予約語ではないにせよ、その名前は混乱の元かも。
混乱の元なので、変更いたします。


> それと、WMI は IDisposable なので、Dispose した方がベターです。
使い終わった後の処理として、了解いたしました。


> >         For Each i In Str
> >             For Each p In mc.GetInstances()
> 外側と内側のループは逆にした方がよいと思いますよ。
確かに、逆にした方が、ドライブごとの情報のまとまった羅列になり見やすくなりますね。


> ループしないならこんな感じ。
>
> Using p As New ManagementObject($"Win32_LogicalDisk.DeviceId=""C:""")
>     p.Get()
>
>     strMem = $"Name={p!Name}
> FileSystem={p!FileSystem}
> FreeSpace={p!FreeSpace}
> Size={p!Size}
> VolumeName={p!VolumeName}
> VolumeSerialNumber={p!VolumeSerialNumber}"
>
> End Using
>
>
> p("FreeSpace") とか p.Item("FreeSpace") とか
> p.Properties("FreeSpace").Value でも良いですけど。
>
>
>
> 元のコードのように ManagementObjectCollection を使うなら、WQL にする手もありますよ。
>
>
> Dim wql = "
> SELECT
>   Name, FileSystem, FreeSpace, Size,
>   VolumeName, VolumeSerialNumber
> FROM
>   Win32_LogicalDisk
> WHERE
>   MediaType=12  OR  MediaType IS NULL
> "
>
> strMem = ""
> Using mc = New ManagementObjectSearcher(wql), disks = mc.Get()
>     For Each p In disks
>
>         strMem &= $"
> Name={p!Name}
> FileSystem={p!FileSystem}
> FreeSpace={p!FreeSpace}
> Size={p!Size}
> VolumeName={p!VolumeName}
> VolumeSerialNumber={p!VolumeSerialNumber}
> -----"
>
>         p.Dispose()
>     Next
> End Using
>
>
>
> ちなみに MediaType = 12 は、ドライブの種類が HDD(SSD) であるものを指しています。
> ドライブ指定にしたいなら、WHERE DeviceId = 'C:' で抽出しておけば OK 。

普段、接することのない、いろんなコードの記述方法があり、完全には理解が出来ておりませんが、
コードがエラーなく動くことを確認いたしました。大変 勉強になります。
CPU、物理メモリ情報も 上記コードを参考にして取得したいと思います。
ありがとうございました。

[ツリー表示へ]