获取磁盘驱动器以及磁盘容量的相关操作

本文介绍了通过Windows API函数GetLogicalDriveStrings、GetDriveType、GetDiskFreeSpaceEx和GetDiskFreeSpace获取磁盘驱动器信息及磁盘容量的方法。示例代码展示了如何计算硬盘的总空间、已用空间和可用空间,以及遍历所有固定驱动器获取其剩余空间的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 其实主要用到的就是以下四个函数:

GetLogicalDriveStrings();

GetDriverType();

GetDiskFreeSpace();

GetDiskFreeSpaceEx();

 

//如果你想获得硬盘大小,可以参见下面的代码:
DWORD   dwTotalDiskSpace,dwFreeDiskSpace,dwUsedDiskSpace;  
   
  ULARGE_INTEGER   uiFreeBytesAvailableToCaller;  
  ULARGE_INTEGER   uiTotalNumberOfBytes;  
  ULARGE_INTEGER   uiTotalNumberOfFreeBytes;  
   
  if(GetDiskFreeSpaceEx(szPath,   &uiFreeBytesAvailableToCaller,  
  &uiTotalNumberOfBytes,    &uiTotalNumberOfFreeBytes))  
  {  
  dwTotalDiskSpace   =   (DWORD)(uiTotalNumberOfBytes.QuadPart   /   1024   /   1024);  
  dwFreeDiskSpace     =   (DWORD)(uiFreeBytesAvailableToCaller.QuadPart   >>   20);  
  dwUsedDiskSpace   =   dwTotalDiskSpace   -   dwFreeDiskSpace;  
  TRACE("硬盘%s::总空间%dMB,   已用%dMB,   可用%dMB\n",   szPath,  
  dwTotalDiskSpace,   dwUsedDiskSpace,   dwFreeDiskSpace);
  }


//     以下求硬盘的剩余空间
DWORD   dw=GetLogicalDriveStrings(0,NULL);
LPTSTR   pAllDrivers=new   char[dw];
::GetLogicalDriveStrings(dw,pAllDrivers);
LPTSTR   pDriver=pAllDrivers;
char   tempDriver[26];
memset(tempDriver, '\0 ',26);
DWORD   DriverNum=0;

unsigned   __int64     l_free=0;
while(pDriver[0]!=0)
{      
if   (GetDriveType(pDriver)==DRIVE_FIXED &&   GetDriveType(pDriver)!=DRIVE_REMOVABLE)
{
tempDriver[DriverNum++]=*pDriver; 
ULARGE_INTEGER   i64FreeAmount;
ULARGE_INTEGER   i64TotalAmount;
CString   ls_drivename=*pDriver;//tempDriver[DriverNum-1]
ls_drivename+=_T( ":\\ ");
::GetDiskFreeSpaceEx(ls_drivename,   &i64FreeAmount,   &i64TotalAmount,   NULL);
//unsigned   __int64     l_total=i64TotalAmount.QuadPart;
l_free+=i64FreeAmount.QuadPart;

}
pDriver=_tcschr(pDriver,0)+1;  

}

void   CDrvSpaceDlg::FindAllDrivers()
{
CComboBox*   Driver=(CComboBox*)GetDlgItem(IDC_DRIVER);
DWORD   dwNumBytesForDriveStrings;//实际存储驱动器号的字符串长度
HANDLE   hHeap;
LPSTR   lp;
CString   strLogdrive;

//获得实际存储驱动器号的字符串长度
dwNumBytesForDriveStrings=GetLogicalDriveStrings(0,NULL)*sizeof(TCHAR);

//如果字符串不为空,则表示有正常的驱动器存在
if   (dwNumBytesForDriveStrings!=0)

{
//分配字符串空间
hHeap=GetProcessHeap();
lp=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,
dwNumBytesForDriveStrings);

//获得标明所有驱动器的字符串
GetLogicalDriveStrings(HeapSize(hHeap,0,lp),lp);

//将驱动器一个个放到下拉框中
while   (*lp!=0)

{
Driver-> AddString(lp);
lp=_tcschr(lp,0)+1;
}
}
else  
AfxMessageBox( "Can 't   Use   The   Function   GetLogicalDriveStrings! ");
}

ULARGE_INTEGER   FreeAv,TotalBytes,FreeBytes;
if(GetDiskFreeSpaceEx(Driver,&FreeAv,&TotalBytes,&FreeBytes))
{
//格式化信息,并显示出来
CString   strTotalBytes,strFreeBytes;
strTotalBytes.Format( "%u字节 ",TotalBytes.QuadPart);
strFreeBytes.Format( "%u字节 ",FreeBytes.QuadPart);
}

//得到当前机器硬盘容量
bool   GetDiscSpace(HWND   hwnd)
{
int       DiscType;
char     RootPath[]   =   "_:\\ ";
char     buffer[MAX_PATH];

DWORD   SectorsPerCluster;
DWORD   BytePerSector;
DWORD   NumberOfFreeClusters;
DWORD   TotalNumberOfClusters;
DWORD   FreeSpace;
DWORD   TotalSpace;


for(int   i=2;i < 'z '- 'a ';i++)
{
RootPath[0]   =   i+ 'a ';
DiscType   =   GetDriveType(RootPath);
if(DiscType   ==   DRIVE_FIXED)
{
GetDiskFreeSpace(RootPath,&SectorsPerCluster,&BytePerSector,&NumberOfFreeClusters,&TotalNumberOfClusters);
FreeSpace     =   SectorsPerCluster   *   BytePerSector   /   1024   * NumberOfFreeClusters   /   1024;
TotalSpace   =   SectorsPerCluster   *   BytePerSector   /   1024   * TotalNumberOfClusters   /   1024;
wsprintf(buffer, "   %s                           %8dMB             %8dMB ",RootPath,TotalSpace,FreeSpace);
SendMessage(GetDlgItem(hwnd,IDC_LIST),LB_ADDSTRING,NULL,(LPARAM)buffer);
}
}

return   false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值