获取驱动器盘符2--代码部分
演示如上所示,如果你想看看怎么做的,请点这里。
-----------------------------------------------------------------
函数原型
DWORD WINAPI GetLogicalDrives(void);
该函数不带任何参数,并返回一个unsigned int类型的值。
返回的值,是一个位掩码(bitmask),代表当前可用的驱动器盘符。从低位开始,0号位置表示盘符A,位置1表示盘符B,位置2表示盘符C;
举例子,如demo演示的程序,返回的是508,将它转换为二进制,则为
1 1 1 1 1 1 1 0 0
对应的盘符为 I H G F E D C B A
根据对应的bitmask,1表示该盘符可用,0表示不可用。所以获取的盘符有C,D,E,F,G,H,I.
这便是如何获取的方法。
关于处理bitmask,也有两种方法。
将返回的数值边转换为二进制,边处理。每次取得最低位,就将它和对应的盘符比较,如果数值为1,就将该盘符加到可用盘符列表中;如果数值为0,则忽略该盘符。
void Cdemo1Dlg::OnBnClickedget() { // TODO: 在此添加控件通知处理程序代码 CString str_drives=L"获取的盘符有:"; unsigned int n_drives=GetLogicalDrives(); wchar_t wdrive[3]=L"A:"; while(n_drives) { if(n_drives%2) { str_drives+=wdrive; str_drives+=L" , "; } wdrive[0]++; n_drives/=2; } edit_data=str_drives; UpdateData(FALSE); }
注:该代码是在MFC环境下的,该函数为一个按钮的点击事件,当用户点击按钮,程序执行这段函数。
eidt_data为一个EDIT控件的控件变量,用来显示获取的盘符。
第二种方法则直接使用位操作,将获取的数值和1进行与运算,然后再进行移位操作
void Cdemo1Dlg::OnBnClickedget() { // TODO: 在此添加控件通知处理程序代码 CString str_drives=L"获取的盘符有:"; unsigned int n_drives=GetLogicalDrives(); wchar_t wdrive[3]=L"A:"; while(n_drives) { if(n_drives&1) { str_drives+=wdrive; str_drives+=L" , "; } wdrive[0]++; n_drives>>=1; } edit_data=str_drives; UpdateData(FALSE); }