其实主要用到的就是以下四个函数:
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;
}