检测逻辑驱动器

来源:互联网 发布:响应式源码 编辑:程序博客网 时间:2024/05/09 01:32

       主要用到的API有GetLogicalDrives ,GetLogicalDirveStrings, GetDriveType, GetDiskFreeSpace.分别介绍如下:

1.  DWORD GetLogicalDrives(void)
     此函数没有参数,它的返回值是一个掩码,用来描述当前可用的逻辑驱动器。第0位代表驱动器A,第一位代表驱动器B,,第2位代表驱动器C,依次类推。若某一位为1,则说明该位所对应的驱动器可用,为0则相反。

2 . DWORD GetLogicalDriveStrings(
                        DWORD nBufferLength,  // 下面lpBuffer所指向的缓冲区大小
                        LPTSTR  lpBuffer )            //  驱动器名缓冲区,其存储格式为"A:/",0,"B:/",0,"C:/",0,....,0,0

3. UINT     GetDriveType( LPCTSTR  lpRootPathName)  // 要检测的逻辑驱动器的根目录
    返回值为:
  DRIVE_UNKOWN                   无法识别该驱动器
        DRIVE_REMOVABLE             可移动磁盘
        DRIVE_CDROM                       光盘
        DRIVE_FIXED                          固定磁盘
        等。

4. BOOL GetDiskFreeSpace(
         LPCTSTR             lpRootPathName,                 //  要检测的磁盘驱动器如"c:/"
         LPDWORD           lpSectionsPerCluster,         //  每一簇的扇区数
         LPDWORD           lpBytesPerSector,                 //  每一扇区的字节数
         LPDWORD           lpNumberOfFreeClusters,  //  空闲簇数
         LPDWORD           lpTotalNumberOfClusters)  //  总共簇数
驱动器总容量的计算:簇总数 x  每簇的扇区数 x 每扇区的字节数
驱动器空闲容量计算:空闲簇数 x  每簇的扇区数 x 每扇区的字节数

例:
       

 char lpBuffer[1024];
 ::GetLogicalDriveStrings(1024, lpBuffer);
 
 int nDrivers = 0;
 while(*(lpBuffer + nDrivers * 4) != 0)
 {
  cout<<lpBuffer+nDrivers * 4 ;
  UINT nType = ::GetDriveType(lpBuffer + nDrivers*4);
  if(nType == DRIVE_UNKNOWN)
  {
   cout<<"/tUNKNOWN/t";
  }else if(nType == DRIVE_REMOVABLE)
  {
   cout<<"/tREMOVABLE/t";
  }else if(nType == DRIVE_FIXED)
  {
   cout<<"/tFIXED/t";
  }else if(nType == DRIVE_CDROM)
  {
   cout<<"/tCDROM/t";
  }

  DWORD dwSectionsPerCluster;   // 每一簇的扇区数
  DWORD dwBytesPerSector;       // 每一扇区的字节数
  DWORD dwNumberOfFreeClusters;  // 可用的簇数
  DWORD dwTotalNumberOfClusters; // 总簇数
  // 驱动器总容量计算公式 :  簇总数 x 每簇扇区数 x 每扇区的字节数
  // 驱动器空闲容量计算公式: 未使用的簇 x 每簇扇区数 x 每扇区的字节数

  GetDiskFreeSpace(lpBuffer + nDrivers * 4 ,
   &dwSectionsPerCluster,
   &dwBytesPerSector,
   &dwNumberOfFreeClusters,
   &dwTotalNumberOfClusters);

  double free,total;
  total = double(dwTotalNumberOfClusters) * double(dwSectionsPerCluster) * double(dwBytesPerSector);
  free  = double(dwNumberOfFreeClusters)  * double(dwSectionsPerCluster) * double(dwBytesPerSector);
  cout<<total/1024<<"K/t";
  cout<<free/1024<<"K";

  cout<<endl;

  nDrivers ++;
 }