检测逻辑驱动器

本文详细介绍了用于获取Windows系统中磁盘信息的四个关键API:GetLogicalDrives、GetLogicalDriveStrings、GetDriveType及GetDiskFreeSpace。通过这些API可以实现获取计算机上的逻辑驱动器列表、判断驱动器类型(如固定磁盘或可移动磁盘)、查询驱动器的总容量及剩余空间等功能。

       主要用到的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 ++;
 }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值