windows api 获取磁盘信息

使用的API函数有

1、GetLogicalDriveStrings  用于获取逻辑驱动器字符串

函数原型:DWORD GetLogicalDriveStrings(DWORD nBufferLength,
LPTSTR lpBuffer);

LPTSTR:字符/字符串指针

函数需要提供一个内存缓冲区lpBuffer来供它保存获取的逻辑驱动器的分区号(C:\ ,D:\等)信息。

2、GetDriveType  逻辑驱动器类型

函数声明如下:

UINT WINAPI GetDriveType(

  _In_opt_ LPCTSTR lpRootPathName

);

 用于判断一个磁盘驱动器的类型

如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则返回指定驱动器类型

 

3、GetDiskFreeSpaceEx  获取逻辑驱动器的容量信息

函数执行成功返回非0值,失败返回0。

 

4、GetLogicalDrives:

 

DWORD GetLogicalDrives(void); 返回值:GetLogicalDrives函数返回一个DWORD类型的值,第一位表示所对应的驱动器是否存在。一般情况下DWORD的数据长度是32位,在这个DWORD中,每一位对应了一个逻辑驱动器是否存在。第二位如果是“1”则表示驱动器“B:”存在,第四位如果是“1”则表示驱动器“D:”存在,以此类推。

 

以下为代码示例:

#include <stdio.h>
#include <Windows.h>

#define GB(x) (x.HighPart << 2) + (x.LowPart >> 20) / 1024.0   // 转换为GB单位显示

void putDrivesType(const char* lpRootPathName);
void putDrivesFreeSpace(const char* lpRootPathName);

int main()
{

int count = 0;
DWORD dw ;
DWORD dwSize = MAX_PATH;

char szLogicalDrives[MAX_PATH] = {0}; //缓冲区
DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives); //获取逻辑驱动器号字符串
//获取驱动器数
dw = GetLogicalDrives();
while( dw != 0 )
{
if(dw&1 != 0)
{
count++;
}
dw>>=1;
}
printf("驱动器个数:%d\n",count);
//处理获取到的结果
if (dwResult > 0 && dwResult <= MAX_PATH) {
char* szSingleDrive = szLogicalDrives; //从缓冲区起始地址开始
while(*szSingleDrive) {
printf("Drive: %s ", szSingleDrive); //输出单个驱动器的驱动器号
putDrivesType(szSingleDrive); //输出逻辑驱动器类型
putDrivesFreeSpace(szSingleDrive); //获取磁盘空间信息
printf("----------------------------\n");
// 获取下一个驱动器号起始地址
szSingleDrive += strlen(szSingleDrive) + 1;
}
}
return 0;
}


void putDrivesType(const char* lpRootPathName)
{
UINT uDriverType = GetDriveType(lpRootPathName);

switch(uDriverType) {
case DRIVE_UNKNOWN :puts("未知的磁盘类型"); break;
case DRIVE_NO_ROOT_DIR: puts("路径无效"); break;
case DRIVE_REMOVABLE: puts("可移动磁盘"); break;
case DRIVE_FIXED: puts("固定磁盘"); break;
case DRIVE_REMOTE: puts("网络磁盘"); break;
case DRIVE_CDROM: puts("光驱"); break;
case DRIVE_RAMDISK: puts("内存映射盘"); break;
default:
break;
}

}

void putDrivesFreeSpace(const char* lpRootPathName)
{
ULARGE_INTEGER available,total,free; //ULARGE_INTEGER  一个64位的无符号整型值
if(GetDiskFreeSpaceEx(lpRootPathName,(ULARGE_INTEGER*)&available,(ULARGE_INTEGER*)&total,(ULARGE_INTEGER*)&free)){
printf(" | 总容量 = %.2f GB,可用空间 = %.2f GB,空闲空间 = %.2f GB\n",
GB(total),GB(available),GB(free));
}else{
puts("获取容量信息失败");
}
}

 

 

posted @ 2019-04-01 10:18  紫秋  阅读(3256)  评论(0编辑  收藏  举报