[分享] C++通过WIN32 API获取逻辑磁盘详细信息

[复制链接]
  • TA的每日心情
    开心
    2014-4-2 21:30
  • 签到天数: 3 天

    [LV.2]九品芝麻官

    534

    主题

    400

    回帖

    7742

    积分

    Intohard Team

    Rank: 7Rank: 7Rank: 7

    积分
    7742
    发表于 2012-4-20 08:52:03 | 显示全部楼层 |阅读模式

    1. #include <iostream>
    2. #include <windows.h>
    3. using namespace std;  

    4. int main()
    5. {
    6.      int DiskCount = 0;
    7.      DWORD DiskInfo = GetLogicalDrives();
    8.      //利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。
    9.      while(DiskInfo)//通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。
    10.      {
    11.          if(DiskInfo&1)//通过位运算的逻辑与操作,判断是否为1
    12.          {
    13.               ++DiskCount;
    14.          }
    15.          DiskInfo = DiskInfo >> 1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。
    16.          //DiskInfo = DiskInfo/2;
    17.      }
    18.      cout<<"逻辑磁盘数量:"<<DiskCount<<endl;
    19. //-------------------------------------------------------------------

    20.       int DSLength = GetLogicalDriveStrings(0,NULL);
    21.      //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度。
    22.      char* DStr = new char[DSLength];//用获取的长度在堆区创建一个c风格的字符串数组
    23.      GetLogicalDriveStrings(DSLength,(LPTSTR)DStr);
    24.      //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。

    25.      int DType;
    26.      int si=0;
    27.      BOOL fResult;
    28.     unsigned _int64 i64FreeBytesToCaller;
    29.     unsigned _int64 i64TotalBytes;
    30.     unsigned _int64 i64FreeBytes;

    31.       for(int i=0;i<DSLength/4;++i)
    32.      //为了显示每个驱动器的状态,则通过循环输出实现,由于DStr内部保存的数据是A:\NULLB:\NULLC:\NULL,这样的信息,所以DSLength/4可以获得具体大循环范围
    33.      {
    34.          char dir[3]={DStr[si],':','\\'};
    35.          cout<<dir;
    36.          DType = GetDriveType(DStr+i*4);
    37.          //GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录
    38.          if(DType == DRIVE_FIXED)
    39.          {
    40.               cout<<"硬盘";
    41.          }
    42.          else if(DType == DRIVE_CDROM)
    43.          {
    44.               cout<<"光驱";
    45.          }
    46.          else if(DType == DRIVE_REMOVABLE)
    47.          {
    48.               cout<<"可移动式磁盘";
    49.          }
    50.          else if(DType == DRIVE_REMOTE)
    51.          {
    52.               cout<<"网络磁盘";
    53.          }
    54.          else if(DType == DRIVE_RAMDISK)
    55.          {
    56.               cout<<"虚拟RAM磁盘";
    57.          }
    58.          else if (DType == DRIVE_UNKNOWN)
    59.          {
    60.               cout<<"未知设备";
    61.          }

    62.          fResult = GetDiskFreeSpaceEx (
    63.               dir,
    64.               (PULARGE_INTEGER)&i64FreeBytesToCaller,
    65.               (PULARGE_INTEGER)&i64TotalBytes,
    66.               (PULARGE_INTEGER)&i64FreeBytes);
    67.          //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据
    68.          if(fResult)//通过返回的BOOL数据判断驱动器是否在工作状态
    69.          {
    70.               cout<<" totalspace:"<<(float)i64TotalBytes/1024/1024<<" MB";//磁盘总容量
    71.               cout<<" freespace:"<<(float)i64FreeBytesToCaller/1024/1024<<" MB";//磁盘剩余空间
    72.          }
    73.          else
    74.          {
    75.               cout<<" 设备未准备好";
    76.          }
    77.          cout<<endl;
    78.          si+=4;
    79.      }

    80.      system("pause");
    81. }
    82.   WIN API函数作为windows操作系统环境下编程的接口,在其它语言,例如VB VB.NET C# DELPHI中使用的时候操作的方法也是差不多的,具体可以参考相关语言的书籍。
    复制代码
  • TA的每日心情
    开心
    2015-8-1 07:19
  • 签到天数: 15 天

    [LV.4]七品知县

    2

    主题

    954

    回帖

    1万

    积分

    [INTOHARD]团长

    Rank: 8Rank: 8

    积分
    14100
    发表于 2012-4-20 20:39:19 | 显示全部楼层
    沙发,支持下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 3577 天

    [LV.Master]三朝元老

    35

    主题

    6002

    回帖

    2万

    积分

    [INTOHARD]旅长

    Rank: 9Rank: 9Rank: 9

    积分
    21011
    发表于 2012-4-20 21:27:18 | 显示全部楼层
    C++编程与数据恢复
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2012-6-6 21:31
  • 签到天数: 17 天

    [LV.4]七品知县

    0

    主题

    25

    回帖

    110

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    110
    发表于 2012-5-22 10:05:48 | 显示全部楼层
    ip觉得程序不够精练。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-10-23 16:36
  • 签到天数: 130 天

    [LV.7]四品道员

    2

    主题

    514

    回帖

    1004

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1004
    发表于 2013-7-9 17:47:06 | 显示全部楼层
    支持一下!多谢分享!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-12-12 18:49
  • 签到天数: 1 天

    [LV.1]布衣百姓

    17

    主题

    183

    回帖

    1235

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1235
    发表于 2013-11-27 18:14:57 | 显示全部楼层
    支持LZ,谢谢分享!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 3577 天

    [LV.Master]三朝元老

    35

    主题

    6002

    回帖

    2万

    积分

    [INTOHARD]旅长

    Rank: 9Rank: 9Rank: 9

    积分
    21011
    发表于 2015-7-17 20:36:29 | 显示全部楼层
    支持支持谢谢分享啊好好学学啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表