VC中如何获取当前计算机中所有逻辑驱动器的数目和盘符

来源:互联网 发布:心怀大局 知责有为 编辑:程序博客网 时间:2024/05/16 15:39

一般都用这两种方法获取本地磁盘盘符: 
1. GetLogicalDriveStrings方法 
        TCHAR buf[100]; 
        DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf); 
        从名字上就知道GetLogicalDriveStrings是获得盘符的字符形式 
     这个函数将所有盘符都存在buf中,形式是这样: 
       "C:/<NULL>D:/<NULL>E:/<NULL><NULL>" 
       即盘符之间用NULL隔开,最后一个盘符后面跟两个NULL 
        所以可以这样从buf中提取单个盘符: 
      for (CString strDisks,TCHAR* s=buf; *s; s+=_tcslen(s)+1) 
        { 
             LPCTSTR sDrivePath = s;     //单个盘符 
             strDisks += sDrivePath;      
             strDisks += " "; 
        } 
      
   2. GetLogicalDrives方法 
              DWORD dwDrives; 
              char a; 
              CString DriveName; 
              dwDrives = GetLogicalDrives(); 
              a = 'A'; 
              while (dwDrives > 0) 
              { 
                   if (dwDrives % 2 == 1) 
                   { 
                        DriveName.Format("%c", a); 
                        GetTreeCtrl().InsertItem(DriveName, m_nImageClose, 
                                      m_nImageOpen, TVI_ROOT, TVI_LAST); 
                   } 
                   a++; 
                   dwDrives /= 2; 
               } 
        GetLogicalDrives函数返回一个DWORD值,4个字节32bit,每个bit代表一个盘符,比如bit0代表A盘,但是因为英文字母只有26个,所以最多可以表示26个盘符,不过,一般来说是够用了~~~~

 

其他-------------------------------------------------------------------------

//函数描述:函数名 Fresource_driveinfo 
//功能:取驱动器信息 
//参数描述: driveInfo存放取得的驱动器统计信息数组, 
// length为数组实际存放项的 
//返回值描述:返回值1表示正常,-1表示出错 
short Fresource_driveinfo( Fdrive_info driveInfo[MAX1],int& length ) 

Fdrive_info DriveInfo; 
memset( &DriveInfo, 0, sizeof( Fdrive_info ) ); 
DWORD dwBuffer=256; 
char szBuffer[256]; 
memset( szBuffer, 0, dwBuffer ); 
int nSize = GetLogicalDriveStrings( dwBuffer, szBuffer ); 
if( nSize == 0 ) 

return -1; 


char szDrivers[32][5]; 
memset( szDrivers, 0, 160 ); 
char szTemp[4]; 
memset( szTemp, 0, 4 ); 
int j=0; 
int nLength=0; // 有几个盘符 
for( int i=0; i<nSize; i++ ) 

if( szBuffer[i] == '/0' ) 

szTemp[j]='/0'; 
strcpy( szDrivers[nLength], szTemp ); 

UINT nDriver = GetDriveType( szDrivers[nLength] ); 
// 得到驱动器的信息 
switch( nDriver ) 

case DRIVE_REMOVABLE: // 是否是软驱 
break; 
case DRIVE_CDROM: 
break; 
case DRIVE_FIXED: 
strcpy( DriveInfo.drive_type, "硬盘" ); 
strcat( DriveInfo.drive_type, "DRIVE_FIXED" ); 

//GetVolumeInformation(); 
//DriveInfo.Partitiontype = ; 
//strcpy( DriveInfo.drive_id, szDrivers[nLength] ); 
//DriveInfo.drive_size = ; 
//GetDiskFreeSpace( szDrivers ); 
break; 

case DRIVE_REMOTE: 
break; 
case DRIVE_RAMDISK: 
break; 

nLength++; 
j=0; 
continue; 

szTemp[j]=szBuffer[i]; 
j++; 


length = nLength; 
return 1; 
}   

 

下面是另一个人的源码:

 

#define _WIN32_WINNT 0x0501

#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <tchar.h>
using namespace std;
int main(int argc, char *argv[])
{
 //获得驱动器标识,调用GetLogicalDrivers()函数可以得到一个32位的DWORD类型的数字,其中每一位标识一个磁盘驱动器,为1表示此驱动器存在,为0表示不存在。磁盘驱动器从A盘开始编号。
 DWORD dDriver = ::GetLogicalDrives();
 vector<string> strVecDriver;
 string strDriver = _T("A://");
 UINT nPos = 0;
 string strTemp;
 while(dDriver)
 {
  if(dDriver & 1)
  {
   strTemp = _T('A') + nPos;
   //用strTemp中是从0开始,长度为1的字符串替换本字符串中从0开始长度为1的字符串。
   strTemp += "aaaa";
   strDriver.replace(0,1,strTemp.c_str(),0,1);
   strVecDriver.push_back(strDriver);
   nPos++;
   cout<<strDriver.c_str()<<endl;
  }
  else
  {
   nPos++;
  }
  //右移一位,来获得每一个磁盘的标识
  dDriver>>=1;
 }
 

原创粉丝点击