C#获取逻辑硬盘信息

1、概述

    若仅简单获取逻辑驱动器的名称列表我们使用.Net框架的Environment.GetLogicalDrives即可,但是若想获得更多关于磁盘驱动器的信息我们可以使用.Net框架下的System.Management 命名空间所提供的类和委托等对大量管理信息和管理事件的集合进行访问(见http://www.iwebtrados.com.cn/post/111.html),这些信息和事件都与 WMI有关,该命名空间下的类实际上也是对WMI的一种封装,应用程序和服务可以使用从 ManagementObjectSearcher 和 ManagementQuery 派生的类,查询感兴趣的管理信息,例如在磁盘上还剩多少可用空间、当前 CPU 利用率是多少、某一应用程序正连接到哪一数据库等等。下面,我将详细阐述如何利用WMI获取逻辑硬盘详细信息。

2、实现过程

(1)首先用visual stdio 2005新建一个c#的winform工程,在form1窗体上拖放一个listview控件以及一个button控件,都采用默认命名,设置listview的view属性为detail,添加5个列名称分别为“名称”,“类型”,“总大小”,“可用空间”,“序列号”。

(2)引入System.Management,具体见http://www.iwebtrados.com.cn/post/102.html

(3)在button_click事件中键入如下代码
  1.       private void button1_Click(object sender, EventArgs e) 
  2.         { 
  3.             SelectQuery sq = new SelectQuery("select * from win32_logicaldisk"); 
  4.             System.Management.ManagementObjectSearcher mos = new ManagementObjectSearcher(sq); 
  5.             // 
  6.             this.listView1.Items.Clear();
  7.             foreach (System.Management.ManagementObject disk in mos.Get()) 
  8.             { 
  9.               ListViewItem item=  listView1.Items.Add(disk["Name"].ToString());
  10.               //Name表示设备的名称
  11.             //各属性的标识见联机的MSDN里,Win32 and COM Development下的WMI。
  12.         //如[url]http://msdn.microsoft.com/en-us/library/aa394173[/url](VS.85).aspx
  13.                 try 
  14.                 { 
  15.                     string strType = disk["DriveType"].ToString(); 
  16.                     switch (strType) //类型 
  17.                     { 
  18.                         case "0": 
  19.                 item.SubItems.Add("未知设备"); 
  20.               break; 
  21.             case "1": 
  22.                         item.SubItems.Add("未分区"); 
  23.                 break; 
  24.             case "2": 
  25.                         item.SubItems.Add("可移动磁盘"); 
  26.                 break; 
  27.             case "3": 
  28.                         item.SubItems.Add("硬盘"); 
  29.               break; 
  30.             case "4": 
  31.                         item.SubItems.Add("网络驱动器"); 
  32.               break; 
  33.             case "5": 
  34.                         item.SubItems.Add("光驱"); 
  35.                 break; 
  36.             case "6": 
  37.                         item.SubItems.Add("内存磁盘"); 
  38.               break; 
  39.                     } 
  40.                 } 
  41.                 catch 
  42.                 { 
  43.                     item.SubItems.Add("设备未准备好"); 
  44.                 } 
  45.                 try 
  46.                 {
  47.                     item.SubItems.Add(GetSizeUseUnit(disk["Size"].ToString()));
  48.                   //未用GetSizeUseUnit函数处理的Size属性以字节为单位 
  49.                 } 
  50.                 catch 
  51.                 { 
  52.                 } 
  53.                 try //可移动设备如光驱在未插入光盘时处于不可用状态,需要捕捉异常。 
  54.                 { 
  55.                     item.SubItems.Add(GetSizeUseUnit(disk["FreeSpace"].ToString())); 
  56.                 } 
  57.                 catch 
  58.                 { 
  59.                 } 
  60.                 try 
  61.                 { 
  62.                     item.SubItems.Add(disk["VolumeSerialNumber"].ToString()); 
  63.                 } 
  64.                 catch 
  65.                 { 
  66.                 } 
  67.             } 
  68.         }

  69.   //处理大小的函数
复制代码
  1. private string GetSizeUseUnit(string size) 

  2.     double dSpace = Convert.ToDouble(size); 
  3.     string sSpace = dSpace.ToString("N"); 
  4.     string[] tmp; 
  5.     string rtnSize = "0"; 
  6.     tmp = sSpace.Split(','); 
  7.     switch (tmp.GetUpperBound(0)) 
  8.     { 
  9.         case 0: 
  10.             rtnSize = tmp[0] + " 字节"; 
  11.             break; 
  12.         case 1: 
  13.             rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " K"; 
  14.             break; 
  15.         case 2: 
  16.             rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " M"; 
  17.             break; 
  18.         case 3: 
  19.             rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " G"; 
  20.             break; 
  21.         case 4: 
  22.             rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " T"; 
  23.             break; 
  24.     } 
  25.     return rtnSize; 
  26. }
复制代码
3、运行效果

这样我们通过 托管版本的WMI就轻松获得逻辑磁盘的相关信息。除了逻辑磁盘,我们通过WMI还可轻松获得CPU,网卡等设备的信息。本代码在Windows XP SP2 + Visual Studio 2005 下编译和调试通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值