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 是一条较好的避免途径。