如何用VolInfo获取逻辑驱动器

1、如何用 VolInfo 获取逻辑驱动器?

2、如何用C#编程修改系统菜单?

我试图写一个能列出系统上的驱动器(C:,D:等)的MFC程序,我也需要知道该驱动器是一个硬盘或是光驱。有这样的一个类来获得此信息吗?

没有提供这种信息的MFC类,但Microsoft Windows有一组卷管理函数能实现这个目的。其中包括获取逻辑驱动器以及卷挂接点(mount points)信息的函数,高级的NTFS的特性不在此之列。对于你的要求,你只要处理逻辑驱动器信息即可。Figure 1显示了相关函数。

有四个基本的函数:GetLogicalDrives, GetLogicalDriveStrings, GetDriveType 和 GetVolumeInformation。第五个是 SetVolumeLabel,如果你愿意,可以用它设置卷标。这些函数都相当简单易懂,为了使用方便起见,我把它们封装到了一个友好的MFC类中:CVolumeMaster,(参见 Figure 2),它可以让你处理CString而不是TCHAR数组。我还写了一个 例子程序:VolInfo.exe,示范了如何使用这个MFC类。你能从本文开始的超链接处下载源代码。Figure 3是VolInfo例子程序在我自己的计算机上运行时显示的详细信息。

Figure 3 详细的驱动器信息

第一个函数,GetLogicalDrives,返回一个DWORD的位掩码(bitmask)值,以告知驱动盘符。“0”表示是驱动器A,“1”表示驱动器B,依次类推。大家知道,英语字母表有26个字母,而DWORD有32位,你们中数学在行的人将快速地推算出:一个DWORD能提供足够大的空间来容纳所有,或者是一些可能的驱动器字母的组合。幸好微软(Redmond)不在西北利亚(古代斯拉夫语的字母有33个字母),CVolumeMaster有一个静态的方法FormatBitMask,它位掩码信息格式化为ASCII----VolInfo程序应用它来显示一条象下面这样的信息:

10110 10001 11000 00000 00000 00000 00

这条信息表示在我的电脑里有驱动器:A、C、D、F、J、K、和L。哟!如果你的大脑皮层以二进制形式编程编多了,迟早会有GetLogicalDriveStrings这样的函数诞生,它返回一个代表所有驱动器字母的重要字符串。每一个驱动器字母拥有D:\(尾随一个‘\’)的形式,这里 D 表示驱动器盘符,每个字符串有一空(null)终结符,结尾处有两个null。既然知道了用 TCHARs 处理很拘束,那么就写一个顺手的CVolumeMaster封装器,用 CStringArray 来保存得到的驱动器字母。毕竟这是个C++专栏。你只要写如下的代码:

CVolumeMaster vm;
  CStringArray arDrives;
  int n = vm.GetLogicalDriveStrings(arDrives);

现在arDrives里是驱动器字母串,n是逻辑驱动器数目。明白了吧?

有哪些驱动器你是知道了,但如何知道各个驱动器是什么类型的呢?GetDriveType就是为此而设。GetDriveType返回一个代码,如 DRIVE_FIXED 代表硬盘,或者 DRIVE_CDROM 代表CD-ROM驱动器。CVolumeMaster有一静态函数,用于将代码格式化为人可识别的字符串;VolInfo用它作为输出。详细情况请参见源代码。

最后,如果你想进一步了解某个逻辑驱动器,比如它的卷标,它使用的文件系统或者驱动器是否支持命名流(named streams)和加密,调用 GetVolumeInformation 函数即可。这种瑞士军刀式的函数可以获得卷标、文件系统名称(如, NTFS 或是FAT)、卷序列号、文件系统标识、最大组件长度。

你会问“最大组件长度是什么鬼东西?” 那是指反斜线符之间路径名称部分长度的文件系统表示。换句话说,如果路径名称是c:\mumble\bletch\oops,那么“mumble”、“bletch”和“oops”就是组件,每个组件的长度是有一个限制的。使用VolInfo,你可以发现NTFS支持组件的最大长度为255,而CD-ROM通常只为127。这就解释了为什么当你保存你全部的MP3到CD,你经常会得到一条信息,告诉你一些文件名或其别的什么东西太长,询问是否截短它。

CVolumeMaster 有一个自己的 GetVolumeInformation 版本——它使用 CString 代替LPTSTR。

CString volname,filesys;
DWORD serno, maxcomplen, flags;
vm.GetVolumeInformation("C:\", volname, serno, maxcomplen, flags, filesys);

与此同时,我坚持使用 CString 的原因并不是因为它更容易,它也很安全。在注重安全以及恶意病毒肆虐的今天,即使阿诺德.施瓦辛格也知道什么是缓冲区溢出。使用 CString 是一条较好的避免途径。

时间: 2024-09-19 20:34:35

如何用VolInfo获取逻辑驱动器的相关文章

javascript-如何用JS获取div下的子div

问题描述 如何用JS获取div下的子div 有多个独立的外层div,每个外层div内嵌一个内层的div,内层div在显示在外层div的下部.我要的效果是,当鼠标移入到一个外层div中时,改变这个外层div内的那个内层div.用Js怎么写代码?求大神指导 解决方案 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-tr

如何用编程获取CD-ROM的驱动器盘符

[提出问题] 最近我正在开发一个程序,任务是从CD-ROM上读取文件,如视频和音频文件.因为每一台机器上的情况都不一样.如何知道CD-ROM驱动器呢? [解答] 首先,一台机器可能有不止一个CD-ROM驱动器.现在CD-ROM已经是PC机的标准配置,此外再装个可擦写的光盘驱动,甚至是DVD都是很常见的事情.不管一台机器上装多少个不同的驱动器,如何找到它们呢? 有关驱动器的函数有GetLogicalDrives,GetLogicalDriveStrings和GetDriveType.前两个用来获取

如何用java获取到本地网卡信息

问题描述 如何用java获取到本地网卡信息 比如我想知道我本地eth0 ip网卡掩码等信息.如何用java得到这些信息. 解决方案 Linux下如何获取网卡信息获取网卡信息获取网卡信息 解决方案二: socket不知道是否可以 解决方案三: http://blog.csdn.net/xionglangs/article/details/50387569,亲测可以使用.

jquery-如何用JQuery获取到已经勾选的checkbox的元素

问题描述 如何用JQuery获取到已经勾选的checkbox的元素 <script src=""http://libs.baidu.com/jquery/1.9.1/jquery.min.js""></script> function bb() { var testNames = $(""""); console.log(testNames); //var checkInputs = $("&

如何用c#获取别的网站的数据,他的数据使用ajax获取的,如何模拟ajax获取一样的数据?

问题描述 如何用c#获取别的网站的数据,他的数据使用ajax获取的,如何模拟ajax获取一样的数据? 如何用c#获取别的网站的数据,他的数据使用ajax获取的,如何模拟ajax获取一样的数据? 解决方案 参考这个:http://blog.csdn.net/htsnoopy/article/details/7094224使用C#的HttpWebRequest模拟登陆网站 解决方案二: 你可以分析下, 他的ajax请求地址, 是不是传和它一样的参数去就会返回数据. 如果不是, 你只能模拟登陆网站.

如何用Jquery获取checkbox多个选项?

问题描述 如何用Jquery获取checkbox多个选项,循环输出结果.  问题补充:我试了,IE,360可以支持,但是火狐不行.这样写才可以:<br /><pre name="code" class="java"> $("#btn5").click(function(){//输出选中的值 var str=""; var abc = $(":checkbox:checked").ea

javascript-请问,如何用JavaScript获取div中插入符光标的像素位置?

问题描述 请问,如何用JavaScript获取div中插入符光标的像素位置? 如题,div是可编辑的,width和height可变,输入的字符不限格式,并且可输入的字符数量庞大. ps:热心的亲们,文本框和input的获取方式对于div来说不太适用,╮(╯▽╰)╭ pps:不是鼠标位置,不是div元素的位置,是当焦点在div时,div里面一闪一闪的那个插入符光标的像素位置,有x,y的那种,或者 {left = p.left + "px"; top = p.top +"px&q

php-如何用PHP获取SWF和gif动画的缩略图?

问题描述 如何用PHP获取SWF和gif动画的缩略图? 用php上传动画.gif或.swf文件,上传后再从动画中提取一帧作为这个视频文件的缩略图,用于在网页中显示 解决方案 http://segmentfault.com/q/1010000002604325 解决方案二: 这个貌似php自己的库还不行哈 ,只有自己写,但是那好难的,你直接在商场的时候加一个缩略图上传吧 解决方案三: 使用GD库实现了两个截屏函数 imagegrabscreen 和 imagegrabwindow ,这两个分别用于

chrome 网页-如何用chrome 获取开发者信息

问题描述 如何用chrome 获取开发者信息 如题 ..如何用chrome 获取开发者信息 ........