VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3980|回复: 41

[原创] C++ 通过WIN32 API 获取逻辑磁盘详细信息的几种方法

[复制链接]
79_avatar_middle
在线会员 发表于 2015-12-23 10:16:34 | 显示全部楼层 |阅读模式
今天我们主要介绍的是几个常用的api函数,通过它我们可以获取用户磁盘的相关信息
其主要函数原型说明如下:



1.获取系统中逻辑驱动器的数量

The GetLogicalDrives function retrieves a bitmask representing the currently available disk drives.

DWORD GetLogicalDrives(void);


2.获取所有驱动器字符串信息

The GetLogicalDriveStrings function fills a buffer with strings that specify valid drives in the system.

DWORD GetLogicalDriveStrings(
  DWORD nBufferLength,
  LPTSTR lpBuffer
);


3.获取驱动器类型

The GetDriveType function determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.

UINT GetDriveType(
  LPCTSTR lpRootPathName
);


4. 获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据

The GetDiskFreeSpaceEx function retrieves information about the amount of space available on a disk volume: the total amount of space, the total amount of free space, and the total amount of free space available to the user associated with the calling thread.

BOOL GetDiskFreeSpaceEx(
  LPCTSTR lpDirectoryName,
  PULARGE_INTEGER lpFreeBytesAvailable,
  PULARGE_INTEGER lpTotalNumberOfBytes,
  PULARGE_INTEGER lpTotalNumberOfFreeBytes
);


以下是完整的示例程序代码

//程序作者:管宁      
//站点:www.cndev-lab.com      
//所有稿件均有版权,如要转载,请务必注名出处和作者

#include <iostream>

#include <windows.h>

using namespace std;



int main()

{

          int DiskCount = 0;

          DWORD DiskInfo = GetLogicalDrives();

          //利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。

          while(DiskInfo)//通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。

          {

                    if(DiskInfo&1)//通过位运算的逻辑与操作,判断是否为1

                    {

                               ++DiskCount;

                    }

                    DiskInfo = DiskInfo >> 1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。

                    //DiskInfo = DiskInfo/2;

          }

          cout<<"逻辑磁盘数量:"<<DiskCount<<endl;

//-------------------------------------------------------------------



          int DSLength = GetLogicalDriveStrings(0,NULL);

          //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度。

          char* DStr = new char[DSLength];//用获取的长度在堆区创建一个c风格的字符串数组

          GetLogicalDriveStrings(DSLength,(LPTSTR)DStr);

          //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。





          int DType;

          int si=0;

          BOOL fResult;

    unsigned _int64 i64FreeBytesToCaller;

    unsigned _int64 i64TotalBytes;

    unsigned _int64 i64FreeBytes;





          for(int i=0;i<DSLength/4;++i)

          //为了显示每个驱动器的状态,则通过循环输出实现,由于DStr内部保存的数据是A:\NULLB:\NULLC:\NULL,这样的信息,所以DSLength/4可以获得具体大循环范围

          {

                    char dir[3]={DStr[si],':','\\'};

                    cout<<dir;

                    DType = GetDriveType(DStr+i*4);

                    //GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录

                    if(DType == DRIVE_FIXED)

                    {

                               cout<<"硬盘";

                    }

                    else if(DType == DRIVE_CDROM)

                    {

                               cout<<"光驱";

                    }

                    else if(DType == DRIVE_REMOVABLE)

                    {

                               cout<<"可移动式磁盘";

                    }

                    else if(DType == DRIVE_REMOTE)

                    {

                               cout<<"网络磁盘";

                    }

                    else if(DType == DRIVE_RAMDISK)

                    {

                               cout<<"虚拟RAM磁盘";

                    }

                    else if (DType == DRIVE_UNKNOWN)

                    {

                               cout<<"未知设备";

                    }



                    fResult = GetDiskFreeSpaceEx (

                               dir,

                               (PULARGE_INTEGER)&i64FreeBytesToCaller,

                               (PULARGE_INTEGER)&i64TotalBytes,

                               (PULARGE_INTEGER)&i64FreeBytes);

                    //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据

                    if(fResult)//通过返回的BOOL数据判断驱动器是否在工作状态

                    {

                               cout<<" totalspace:"<<(float)i64TotalBytes/1024/1024<<" MB";//磁盘总容量

                               cout<<" freespace:"<<(float)i64FreeBytesToCaller/1024/1024<<" MB";//磁盘剩余空间

                    }

                    else

                    {

                               cout<<" 设备未准备好";

                    }

                    cout<<endl;

                    si+=4;

          }

评分

参与人数 4驿站币 +8 热心值 +8 收起 理由
88_avatar_small 寂寞江湖 + 2 + 2 写的很详细
11_avatar_small 饮水机 + 1 + 1 赞一个!
81_avatar_small Debug + 3 + 3 很给力!
65_avatar_small 编程者 + 2 + 2

查看全部评分





上一篇:windows控制台程序关于UNICODE字符的总结
下一篇:WIN32API常用进程、线程函数
06_avatar_middle
在线会员 发表于 2015-12-23 15:34:45 | 显示全部楼层
看看啥API
81_avatar_middle
online_moderator 发表于 2015-12-23 16:32:07 | 显示全部楼层
看看什么好东东,还藏的这么深。。。
08_avatar_middle
在线会员 发表于 2015-12-23 19:55:25 | 显示全部楼层
C++ 通过WIN32 API 获取逻辑磁盘详细信息的几种方法
39_avatar_middle
在线会员 发表于 2015-12-23 21:22:28 | 显示全部楼层
学习学习
15_avatar_middle
在线会员 发表于 2015-12-23 21:34:29 | 显示全部楼层

看看啥API
72_avatar_middle
在线会员 发表于 2015-12-23 21:42:04 | 显示全部楼层
看看什么情况
89_avatar_middle
在线会员 发表于 2015-12-24 09:20:24 | 显示全部楼层
看看啥API
15_avatar_middle
在线会员 发表于 2015-12-24 12:40:21 | 显示全部楼层
顶楼主啦..希望楼主多发精品好帖啦.....
79_avatar_middle
ico_lz  楼主| 发表于 2015-12-24 16:30:13 | 显示全部楼层
b23526 发表于 2015-12-24 12:40
顶楼主啦..希望楼主多发精品好帖啦.....

那你为什么不给我加热心值
79_avatar_middle
ico_lz  楼主| 发表于 2015-12-24 16:30:50 | 显示全部楼层
Debug 发表于 2015-12-23 16:32
看看什么好东东,还藏的这么深。。。

感觉不错还不加积分 打消积极性吗
50_avatar_middle
在线会员 发表于 2015-12-25 01:06:12 | 显示全部楼层
谢谢分享vv
04_avatar_middle
在线会员 发表于 2015-12-25 11:38:54 | 显示全部楼层
值得学习的
65_avatar_middle
donate_vip 发表于 2015-12-25 20:41:15 | 显示全部楼层
卡你来不错
85_avatar_middle
在线会员 发表于 2015-12-26 00:19:50 | 显示全部楼层
C++ 通过WIN32 API 获取逻辑磁盘详细信息的几种方法 [修改]
58_avatar_middle
在线会员 发表于 2015-12-26 09:11:09 | 显示全部楼层
看看 吧~
84_avatar_middle
在线会员 发表于 2015-12-26 15:34:23 | 显示全部楼层
逻辑磁盘详细信息的几种方法 [修改]
81_avatar_middle
online_moderator 发表于 2015-12-27 22:49:05 | 显示全部楼层
源代码 发表于 2015-12-24 16:30
感觉不错还不加积分 打消积极性吗

哈哈,已经加啦
79_avatar_middle
ico_lz  楼主| 发表于 2015-12-28 00:12:55 | 显示全部楼层
Debug 发表于 2015-12-27 22:49
哈哈,已经加啦

还有其他的帖子 看看能过你的法眼吗  希望也可以加分
13_avatar_middle
在线会员 发表于 2015-12-28 10:41:13 | 显示全部楼层
看看看看看
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-21 17:48

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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