遍历磁盘信息

来源:互联网 发布:app软件排名 编辑:程序博客网 时间:2024/05/17 20:21
//.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;
}  

0 0