//.h
#pragma once
#include <windows.h>
#include <list>
using std::list;
typedef struct _DRIVE_INFO
{
WCHAR szName[MAX_PATH]; // 名称
WCHAR szDriveTitle[32]; // 驱动器名称
UINT uDriveType; // 驱动器类型
WCHAR szDriveTypeDescription[32]; // 驱动器类型描述
DWORD dwVolumeSerialID; // 驱动器的卷系列号
DWORD dwMaxComponentLen; // 文件名最大长度
DWORD dwFileSystemFlags; // 文件系统标记
//WCHAR szFlagsDescription[32]; // 文件系统标记描述
WCHAR szFileSystemName[16]; // 文件系统名称
struct _STORAGE_INFO
{
DWORD dwTotalClusters; // 可用扇区总量
DWORD dwFreeClusters; // 空闲扇区总量
DWORD dwSectPerClust; // 每簇的扇区数量
DWORD dwBytesPerSect; // 每个扇区的容量(字节)
DWORD64 qwTotalBytes; // 磁盘空间大小
DWORD64 qwFreeBytes; // 空闲空间总量
}STORAGE_INFO;
}DRIVE_INFO,*PDRIVE_INFO;
class CDiskControl
{
public:
CDiskControl(void);
~CDiskControl(void);
public:
BOOL GetDirverInfo(LPCTSTR szName);
list<DRIVE_INFO> *GetDriveInfoList();
private:
list<DRIVE_INFO> m_lstDriveInfo;
};
//.CPP
#include "DiskControl.h"
CDiskControl::CDiskControl(void)
{
WCHAR szPathName[MAX_PATH] = {0};
GetLogicalDriveStrings(MAX_PATH,szPathName);
for ( int i=0; szPathName[i]!='\0' && i<MAX_PATH; i++ )
{
GetDirverInfo(&szPathName[i]);
i += wcslen(&szPathName[i]);
}
}
CDiskControl::~CDiskControl(void)
{
}
BOOL CDiskControl::GetDirverInfo(LPCTSTR szName)
{
DRIVE_INFO stcInfo = {0};
// 1. 保存驱动器名称
wcscpy_s(stcInfo.szName,szName);
// 2. 保存驱动器类型
stcInfo.uDriveType = GetDriveType(szName);
// 3. 保存驱动器描述信息
switch (stcInfo.uDriveType)
{
case DRIVE_UNKNOWN:
wcscpy_s(stcInfo.szDriveTypeDescription, L"未知");
break;
case DRIVE_NO_ROOT_DIR:
wcscpy_s(stcInfo.szDriveTypeDescription, L"驱动器的根路径无效");
break;
case DRIVE_REMOVABLE:
wcscpy_s(stcInfo.szDriveTypeDescription, L"可移动介质类驱动器");
break;
case DRIVE_FIXED:
wcscpy_s(stcInfo.szDriveTypeDescription, L"不可移除的驱动器");
break;
case DRIVE_REMOTE:
wcscpy_s(stcInfo.szDriveTypeDescription, L"网络驱动器");
break;
case DRIVE_CDROM:
{
if ( !GetVolumeInformation(stcInfo.szName,NULL,NULL,NULL,NULL,NULL,NULL,NULL) )
wcscpy_s(stcInfo.szDriveTypeDescription, L"CD-ROM驱动器(有光盘)");
else
wcscpy_s(stcInfo.szDriveTypeDescription, L"CD-ROM驱动器(无光盘)");
break;
}
case DRIVE_RAMDISK:
wcscpy_s(stcInfo.szDriveTypeDescription, L"RAM驱动器");
break;
default:
wcscpy_s(stcInfo.szDriveTypeDescription, L"驱动器类型错误");
break;
}
// 4. 获取并保存驱动器的卷系列号、文件名最大长度、文件系统标记、文件系统名称信息
GetVolumeInformation(
stcInfo.szName, // 盘符/驱动器名
stcInfo.szDriveTitle, // 驱动器标题
MAX_PATH, // 标题名数组最大空间
&stcInfo.dwVolumeSerialID, // 驱动器的卷系列号
&stcInfo.dwMaxComponentLen, // 文件名最大长度
&stcInfo.dwFileSystemFlags, // 文件系统标记
stcInfo.szFileSystemName, // 文件系统名
MAX_PATH); // 文件系统名数组最大空间
// 5. 使用GetDiskFreeSpace获取磁盘信息并打印结果
GetDiskFreeSpace (szName, // 盘符/驱动器名
&stcInfo.STORAGE_INFO.dwSectPerClust, // 每簇的扇区数量
&stcInfo.STORAGE_INFO.dwBytesPerSect, // 每个扇区的字节数
&stcInfo.STORAGE_INFO.dwFreeClusters, // 空闲簇的总数
&stcInfo.STORAGE_INFO.dwTotalClusters); // 全部簇的总数
stcInfo.STORAGE_INFO.qwTotalBytes =
(DWORD64)stcInfo.STORAGE_INFO.dwTotalClusters /* 全部簇的总数 */
* (DWORD64)stcInfo.STORAGE_INFO.dwSectPerClust /* 每簇的扇区数量 */
* (DWORD64)stcInfo.STORAGE_INFO.dwBytesPerSect; /* 每个扇区的容量 */
stcInfo.STORAGE_INFO.qwFreeBytes =
(DWORD64)stcInfo.STORAGE_INFO.dwFreeClusters /* 空闲簇的总数 */
* (DWORD64)stcInfo.STORAGE_INFO.dwSectPerClust /* 每簇的扇区数量 */
* (DWORD64)stcInfo.STORAGE_INFO.dwBytesPerSect; /* 每个扇区的容量 */
// 6. 保存此信息
m_lstDriveInfo.push_back(stcInfo);
return TRUE;
}
list<DRIVE_INFO>* CDiskControl::GetDriveInfoList()
{
return &m_lstDriveInfo;
}