网络营销推广网站收录,怎么创建网页超链接,网站主导航,怎么让网站栏目页收录在编写某些Windows管理应用程序时#xff0c;能够从自定义的驱动器选择列表框中进行选择无疑是非常专业的#xff0c;使用Delphi或者C的早期版本时我们都必须使用Win32所提供的许多关于获取磁盘信息的API函数来分别获取像卷标、序列号以及剩余空间等信息#xff0c;现在我们…在编写某些Windows管理应用程序时能够从自定义的驱动器选择列表框中进行选择无疑是非常专业的使用Delphi或者C的早期版本时我们都必须使用Win32所提供的许多关于获取磁盘信息的API函数来分别获取像卷标、序列号以及剩余空间等信息现在我们将使用.Net框架和WMI(Windows Management Instrumentation - Windows 管理规范 )来实现上述功能。一、 简介若仅简单获取逻辑驱动器的名称列表我们使用.Net框架的Environment.GetLogicalDrives即可但是若想获得更多关于磁盘驱动器的信息我们可以使用.Net框架下的System.Management 命名空间所提供的类和委托等对大量管理信息和管理事件的集合进行访问这些信息和事件都与 WMI有关该命名空间下的类实际上也是对WMI的一种封装应用程序和服务可以使用从 ManagementObjectSearcher 和 ManagementQuery 派生的类查询感兴趣的管理信息例如在磁盘上还剩多少可用空间、当前 CPU 利用率是多少、某一应用程序正连接到哪一数据库等等现在我们就以 C# 语言编写获取详细的逻辑驱动器信息的示例来展示.Net框架System.Management 命名空间的相关类和WMI编程如下图二、技术要点WMI最初是内置在 Windows 2000、Windows XP 和 Windows Server 2003 系列操作系统中核心的管理支持技术目前WMI 已经是一种规范和基础结构通过它可以访问、配置、管理和监视几乎所有的 Windows 资源例如磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。在 WMI 之前能够以编程方式访问 Windows 资源的惟一方法就是通过 Win32 API现在我们除了使用WMI 脚本管理任何通过 WMI 公开的 Windows 资源外还可以通过.Net框架对于WMI封装的System.Management 命名空间来轻松实现。我们首先使用WMI查询来获取特定类名的SelectQuery实例可以有两种方法创建该实例一是可以传递一个已知的类名譬如本文需要传递的类名为Win32_LogicalDisk代码如下SelectQuery selectQuery new SelectQuery(win32_logicaldisk);或者使用wql查询来创建查询类的实例代码如下SelectQuery selectQuery new SelectQuery(select * from win32_logicaldisk);或者只获取类的部分属性代码如下SelectQuery selectQuery new SelectQuery(select Name,DriveType from win32_logicaldisk);WQL查询语言是 SQL 的一个子集查询通过包含以下内容限制返回的数据量1、SELECT 子句指定只返回某些属性的数据2、WHERE 子句指定要返回的实例。Win32_LogicalDisk类在默认的本地MSDN里是无法找到的只有在联机的MSDN里Win32 and COM Development下的WMI下才能找到同样可以使用的类还有很多很多包含登录用户信息的Win32_Account类、包含本地和共享打印机信息的Win32_PrinterShare类等等。Win32_LogicalDisk里所包含的驱动器属性相当丰富如下图然后使用该指定的SelectQuery查询创建ManagementObjectSearcher实例此类是用于检索管理信息的较为常用的入口点之一实例创建结束我们需要调用Get方法执行查询以便检索管理对象的集合当调用该方法时ManagementObjectSearcher 在指定的范围内执行给定的查询并返回与 ManagementObjectCollection 中的查询匹配的管理对象的集合这是就可以在一个循环中遍历集合中的所有对象并获取我们所感兴趣的对象的属性代码如下……SelectQuery selectQuery new SelectQuery(select * from win32_logicaldisk);ManagementObjectSearcher searcher new ManagementObjectSearcher(selectQuery);int i0;foreach (ManagementObject disk in searcher.Get()) {//获取驱动器盘符listView1.Items.Add(disk[Name].ToString());}……三、 程序实现我们使用Visual Studio 2005来创建该示例程序首先创建C#的Windows应用程序空白项目为解决方案和项目取名为 GetLogicDrives在默认的Form1窗体上我们各放置一个ListView和一个Button控件保留控件的默认名称不变将ListView1的View属性设为Details双击ListView1的Columns属性为详细信息视图添加5个列分别为盘符、卷标、类型、容量和可用空间设置Button1的Text属性为Refresh为该Button1添加单击事件代码如下private void button1_Click(object sender, EventArgs e){listView1.Items.Clear();SelectQuery selectQuery new SelectQuery(select * from win32_logicaldisk);ManagementObjectSearcher searcher new ManagementObjectSearcher(selectQuery);int i0;foreach (ManagementObject disk in searcher.Get()) {//盘符listView1.Items.Add(disk[Name].ToString());//卷标try{listView1.Items[i].SubItems.Add(disk[VolumeName].ToString());}catch{listView1.Items[i].SubItems.Add(设备未准备好);}//驱动器类型string DriveType;try{DriveType disk[DriveType].ToString();switch (DriveType){case 0:listView1.Items[i].SubItems.Add(未知设备);break;case 1:listView1.Items[i].SubItems.Add(未分区);break;case 2:listView1.Items[i].SubItems.Add(可移动磁盘);break;case 3:listView1.Items[i].SubItems.Add(硬盘);break;case 4:listView1.Items[i].SubItems.Add(网络驱动器);break;case 5:listView1.Items[i].SubItems.Add(光驱);break;case 6:listView1.Items[i].SubItems.Add(内存磁盘);break;}}catch{listView1.Items[i].SubItems.Add(未知类型);}//容量try{listView1.Items[i].SubItems.Add(GetSizeUseUnit(disk[Size].ToString()));}catch{listView1.Items[i].SubItems.Add(设备未准备好);}//剩余空间try{listView1.Items[i].SubItems.Add(GetSizeUseUnit(disk[FreeSpace].ToString()));}catch{listView1.Items[i].SubItems.Add(设备未准备好);}i;}}我们使用了格式化显示磁盘空间容量的自定义函数GetSizeUseUnit当不使用该函数时磁盘容量和可用空间的显示如下private string GetSizeUseUnit(string size){double dSpace Convert.ToDouble(size);string sSpace dSpace.ToString(N);string[] tmp;string rtnSize 0;tmp sSpace.Split(,);switch (tmp.GetUpperBound(0)){case 0:rtnSize tmp[0] 字节;break;case 1:rtnSize tmp[0] . tmp[1].Substring(0,2) K;break;case 2:rtnSize tmp[0] . tmp[1].Substring(0, 2) M;break;case 3:rtnSize tmp[0] . tmp[1].Substring(0, 2) G;break;case 4:rtnSize tmp[0] . tmp[1].Substring(0, 2) T;break;}return rtnSize;}使用了上述自定义格式化显示的函数后磁盘容量和可用空间的显示就显得非常简洁和直观。最后为了确保在窗体启动时自动获取驱动器信息需要在窗体的Load事件中模拟对Button1的单击操作代码如下private void Form1_Load(object sender, EventArgs e){button1_Click(sender, e);}四、 总结我们利用.Net框架System.Management 命名空间所提供的WMI封装非常简单的实现了获取逻辑驱动器的详细信息除了上述信息我们还可以轻松的获取Windows资源大部分信息比起使用Win32API要更加简单和有效。该示例程序在Windows XP SP2 Visual Studio 2005 下编译和调试通过。