获取磁盘逻辑分区 相关信息 1

来源:互联网 发布:网络上的v是什么意思 编辑:程序博客网 时间:2024/06/04 18:50
class CLogicalDriver{public:    CLogicalDriver();    void mfGetLogicalCapacity(char mcLogicalName);    void mfGetLogicalPhysicalAndOffset(char mcStrName);    void mfGetLogicalNumber();    void mfGetValidLogical();public:    ULARGE_INTEGER mdTotalCapacity;    ULARGE_INTEGER mdFreeCapacity;ULARGE_INTEGER mdTotalFreeCapacity;    char mcLogicalNumer[3];    int  miParentPhysicalNumber;    int  miTypeFlag;    char macValidLogicalArry[26];    int  miValidLogicalCount;__int64 miPhysicalBaseOffset;};


#include "Disk.h"CLogicalDriver::CLogicalDriver(){    memset(mcLogicalNumer,0,sizeof(mcLogicalNumer));    miParentPhysicalNumber =-1;miPhysicalBaseOffset =0;    miTypeFlag =0;}void CLogicalDriver::mfGetLogicalCapacity(char mcStrName){char mcLogicalName[4]={0};sprintf(mcLogicalName,"%c:",mcStrName);if( GetDiskFreeSpaceEx(mcLogicalName,&mdFreeCapacity,&mdTotalCapacity,&mdTotalFreeCapacity))    {printf("%s total:%I64u free:%I64u user:%I64u",mcLogicalName,mdTotalCapacity.QuadPart,mdTotalFreeCapacity.QuadPart,mdFreeCapacity.QuadPart);     } if(GetDriveType(mcLogicalName)==DRIVE_REMOVABLE)     {            miTypeFlag=2;         //useful code     }     else     {            miTypeFlag=1;     } printf("   type%d \n",miTypeFlag);}void CLogicalDriver::mfGetLogicalPhysicalAndOffset(char mcStrName){char mcLogicalTemp[20]={0};sprintf(mcLogicalTemp,"\\\\.\\%c:",mcStrName);  HANDLE m_hDriver = CreateFileA(mcLogicalTemp, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);     if (m_hDriver == INVALID_HANDLE_VALUE)     {            cout<<"open error"<<endl;                  }        //位于物理磁盘的偏移地址        DWORD dwOutByte;        PARTITION_INFORMATION partInfo;        BOOL bDeviceRet = DeviceIoControl(m_hDriver, IOCTL_DISK_GET_PARTITION_INFO,                                          NULL, 0, &partInfo, sizeof(PARTITION_INFORMATION), &dwOutByte, NULL);        miPhysicalBaseOffset = partInfo.StartingOffset.QuadPart;//位于物理磁盘的偏移地址        if(!bDeviceRet)            printf("funciton error DiskInfo.cpp line 78");        //位于哪一块物理磁盘        STORAGE_DEVICE_NUMBER msNumber;        DWORD mdReaded;        bDeviceRet =DeviceIoControl(m_hDriver,IOCTL_STORAGE_GET_DEVICE_NUMBER,NULL,0,&msNumber,sizeof(msNumber),&mdReaded,NULL);        if(!bDeviceRet)        {    printf("funciton error DiskInfo.cpp line 89");  return;}miParentPhysicalNumber=msNumber.DeviceNumber;printf("  %I64u  --- parent %d \n",this->miPhysicalBaseOffset,this->miParentPhysicalNumber);}void CLogicalDriver::mfGetValidLogical (){        static TCHAR *pszWordTable = TEXT("ABCDEFGHIJKLMNOPQRSTUVWXYZ");        DWORD dwDisk;        //DWORD          DWORD dwBase = 0x01;        DWORD dwCount = 0;//记录磁盘数量        DWORD dwScanCount = 0;//要扫描的有效磁盘数量,用于返回        DWORD dwStyle;        TCHAR szDiskPath[4] = {0};//缓存一个磁盘根目录名        TCHAR szDiskArray[26] = {0};//记录要扫描的磁盘名        dwDisk = GetLogicalDrives();        while(dwDisk && (dwCount <= ::lstrlen(pszWordTable)) )        {            memset(szDiskPath, 0, sizeof(szDiskPath));            if(dwDisk & dwBase)            {                ::lstrcpyn(szDiskPath, pszWordTable + dwCount, 2);                ::lstrcat(szDiskPath, TEXT(":\\"));                dwStyle = GetDriveType(szDiskPath);                //是否可扫描                if( DRIVE_RAMDISK == dwStyle  ||  DRIVE_FIXED == dwStyle || DRIVE_REMOVABLE==dwStyle )                {                    szDiskArray[dwScanCount] = pszWordTable[dwCount];                    dwScanCount++;                }            }            //dwDisk = dwDisk & ~dwBase;            dwBase = dwBase << 1;            dwCount++;        }        memcpy(macValidLogicalArry, szDiskArray,sizeof(szDiskArray));        miValidLogicalCount =dwScanCount;}


测试

#include "Disk.h"#include <stdio.h>int main(){CLogicalDriver* mLogical =new CLogicalDriver;mLogical->mfGetValidLogical();printf("%s  -%d ",mLogical->macValidLogicalArry,mLogical->miValidLogicalCount);char mArray[6]="cdegj";for(int i=0;i<5;i++){mLogical->mfGetLogicalCapacity(mArray[i]);}mLogical->mfGetLogicalPhysicalAndOffset(mArray[4]);getchar();   return 0;}

接下来 继续完善 最终效果

可以 通过一个物理磁盘 列出其下面的所有逻辑分区 等相关信息