c# 获取路径的盘符_c#获取驱动器盘符

在编写某些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 i=0;

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 i=0;

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 下编译和调试通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php fckeditor demo,如何使用PHP添加fckeditor

[更新答案]你需要把你的fckeditor代码放在 标签而不是在顶部。此外,$_POST["FCKEditor"]需要放进去$oFCKeditor->Value变量。这样做:它在我的机器上工作正常,并在fckeditor文本区域内显示格式化的HTML:EditorTitle : include("fckeditor.php");$sBaseP…

php 命名空间通俗易懂_PHP进阶由浅入深掌握面向对象开发

视频教程出自黑马程序员PHP基础_由浅入深掌握面向对象开发【讲解方式】系统梳理和分解知识,各个点逐步讲解,由浅入深,通俗易懂,层层深入【课程亮点】1,已经完成PHP基础知识学习的朋友有帮助2,生动形象&…

qt读oracle时间戳,QT利用QDateTime获取当前时间戳的方法toTime_t

1.toTime_t()把2014年12月19日10:24:40这样的QDateTime的格式转变为1418955940这样的时间戳QDateTime time QDateTime::currentDateTime(); //获取当前时间int timeT time.toTime_t(); //将当前时间转为时间戳2.与toTime_t()功能相反的是fromTime_…

怎么查看父子级目录linux,如何查找linux中特定父目录的所有文件?

如何在linux命令终端中找到具有特定父目录的所有文件?我知道找到所有的文件,使用这样查找:find . -name filename.extension但是可以找到所有filename.extension文件与父目录的文件夹名吗?我尝试了以下操作,但这不行:find . -name…

如何在matlab里输入复杂公式_在MATLAB作图中输出漂亮的公式

函数语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{T}\sinh g\cosh h\tanh i\operatorname{sh}j\operatorname{argsh}k\operatorname{ch}h\operatorname{argch}l\operatorname{th}i\operatorname{argth}mk(x)\l…

ln -s命令 linux,Linux下 ln -s 软链接用法

NAMEln - make links between filesSYNOPSISln [OPTION]... TARGET [LINK_NAME]ln [OPTION]... TARGET... DIRECTORYln [OPTION]... --target-directoryDIRECTORY TARGET...软链接用法是: ln -s 实际存在的目标目录 链接名称(不存在的) 。[rootDMDIDATAGUARD /]# cd…

cryptapi双向认证_[加密解密]CryptoAPI简介

CryptoAPI概述Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂…

vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决

最近学习使用vuejs前后端分离,重构一个已有的后台管理系统,遇到了下面这个问题:实现跨域请求时,每次ajax请求都是新的session,导致无法获取登录信息,所有的请求都被判定为未登陆。1、 vuejs ajax跨域请求最…

win10时间和linux不同步时间,ubuntu16和windows10的时间同步问题

一句话搞定sudo hwclock --localtime --systohc命令: hwclock全称: hardware clock硬件时钟作用: Query or set the hardware clock.Functions:-h, --help show this help text and exit-r, --show read hardware clock and print result--get re…

linux直接用iso文件装服务,linux系统安装iso文件方法

摘要:linux系统下怎么安装iso文件?安装步骤:1、在/mnt目录下,创建相应的iso文件夹,例如iso。2、运行以下命令,挂载iso文...安装步骤:1、在/mnt目录下,创建相应…

smbus协议的command_SMBus总线概述

1.概述:系统管理总线是一种两线制接口。它基于I2C 总线原理演变而来,可以认为是简化版的I2C总线。SMBus最初是应用到智能电池,如电池充电器和一个微控制器。其提供一个系统和电源管理相关的任务控制总线。如今,SMBus总线可以连接的…

在电脑上显示未知发布者怎么办_电脑提示未知发布者 - 卡饭网

IE浏览器提示未知发布者安全警告怎么办IE浏览器提示未知发布者安全警告怎么办 IE浏览器提示未知发布者安全警告的解决方法, IE浏览器提示未知发布者怎么办?安下小编就来分析一下. 1.打开IE浏览器,从右上角打开Internet选项; 2.点击切换到"高级"选项卡; 3.在设置列表…

linux 邮件日志,linux下如何建立邮件日志

先关闭sendmailservice sendmail stopchkconfig sendmail off安装DNSmount /dev/cdrom /mntyum install bind-*配置主DNS服务器vim /var/named/chroot/etc/named.confoptions {directory "/var/named";};zone "daijingjie.com" {type master;file &qu…

linux 修改网卡报错xe,centos修改端口出现Failed to start OpenSSH server daemon 启动报错和-xe报错的解决方法...

修改SSH端口:# vi /etc/ssh/sshd_config里面找port 22,在前面加上#,去掉注释,然后把22改成你想要的端口。#port 22建议去掉注释之前,先增加你需要的端口,比如:12345端口,生效后在删除…

python中issubset是什么_python3解释器执行 {2, 3, 4}.issubset({2, 3, 4})的结果为__。

【单选题】一个1拖4的USB集线器,用外接电源供电的情况下,为下游USB供电的电流是()?【单选题】组成容量为128K32位的存储器,需用( )片具有16位地址码可同时存取8位数据的RAM集成芯片。【判断题】在排料过程中,系统可以自…

scp linux 自动化,expect(spawn) 自动化git提交和scp拷贝---centos(linux)

在进行SCP文件拷贝中,往往需要进行用户密码的输入,即用户交互。若采用自动化脚本的方式进行,则可用以下方式#!/usr/bin/expect# 设置参数set src [lindex $argv 0]set dest [lindex $argv 1]set password [lindex $argv 2]set appId [lindex …

java或异运算_java中与运算,或运算,异或运算,取反运算

//与运算 & 规则 :都为1时才为1System.out.println( 7 & 9);/** 7二进制 0111* 9二进制 1001* -----------* 0001 1* *///或运算 | 规则:有一个为1,则为1System.out.println(7 | 9);/** 7二进制 0111* 9二进制 1001* ---…

迷你linux操作系统,自己动手做一个迷你型Linux操作系统

本文要构建的这个迷你型的 Linux 系统只能在一台特定的单机上运行,如果读者朋友们有兴趣的话,在这个系统的基础上加以改进,是可以构建出通用的、可以在大多数常规 PC 机上即插即用的系统来的。但是这已经不在本文的话题之内了,读者…

linux查看vtk版本,vtk在linux下的安装(12月8日更新)

安装前准备运行环境:ubuntu14.04 LTS, 64bit //本人在ubuntu 14.10下安装失败安装版本:vtk6.1.0.tar.gz vtkdata6.1.0.tar.gz编译器:g$ sudo apt-cache search gcc*g以保证能搜索到g,然后$ sudo apt-get install gmak…

手动开启群辉php_如何使用Synology从php页面连接到mysql服务器?

我有一个较旧的Synology设备(DSM v5.2-5967 Update 4,phpmyadmin v4.4.7-0103),它有一些带有工作php页面的本地网站.我想将其迁移到我的新Synology设备(DSM V6.1.3-15152 Update 1,phpmyadmin v4.6.6-0172).从Package Center安装新版本的phpmyadmin时,我也需要下载Maria DB和PH…