更新时间:2015-11-18 22:48:16浏览次数:1+次
在解决资源管理器中右键项目->添加->类,弹出对话框,如图:
选择C++类;
命名为DiskInfoManage;
然后我们在DiskInfoManage类头文件中添加三个函数,返回值我们将其设为64位的;
__int64 GetTotalSpaceEx(TCHAR *szDisk); //获取总的磁盘空间
__int64 GetFreeSpaceEx(TCHAR *szDisk); //获取可用空间
__int64 EnumDisk(TCHAR *szBuffer); //列举系统磁盘
接着我们在DiskInfoManage类的实现文件中添加三个函数的实现文件:
__int64 DiskInfoManage::EnumDisk(TCHAR *szBuffer)
{
try
{
DWORD dwBufferSize = GetLogicalDriveStrings(0, NULL);
int nRet = GetLogicalDriveStrings(dwBufferSize, szBuffer);
return nRet;
}
catch (...)
{
TRACE("磁盘信息获取失败!");
return -1;
}
return 0;
}
__int64 DiskInfoManage::GetFreeSpaceEx(TCHAR *szDisk)
{
ULARGE_INTEGER dwAvailalbe, dwFree, dwTotal;
BOOL bRet = GetDiskFreeSpaceEx(szDisk, &dwAvailalbe, &dwTotal, &dwFree);
if (bRet)
{
return dwFree.QuadPart;
GetLastError();
}
return 0;
}
__int64 DiskInfoManage::GetTotalSpaceEx(TCHAR *szDisk)
{
ULARGE_INTEGER dwAvailalbe, dwFree, dwTotal;///64位的无符号整型数
BOOL bRet = GetDiskFreeSpaceEx(szDisk, &dwAvailalbe, &dwTotal, &dwFree);
if (bRet)
{
return dwTotal.QuadPart;
GetLastError();
}
return 0;
}
其中ULARGE_INTEGER,我们看下类型定义:
ULARGE_INTEGER //一个64位的无符号整型值
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
};
ULONGLONG QuadPart;
} ULARGE_INTEGER;
这就是我们需要将三个函数的返回值设为64位的原因。
GetDiskFreeSpaceEx函数我在《利用GetDiskFreeSpaceEx函数获得电脑磁盘容量》讲解了,你自己看看,在这里我就不详述了。
下面我们接着继续:
我们在SysDiskInfoDlg的头文件中,引入DiskInfoManage的头文件,这个很重要哦!
我们看下对话框的控件:
我们为ComboBox控件关联控件变量,三个编辑框关联值变量:
CComboBox m_DiskList;
CString m_TotalSize;////总容量
CString m_OccupySize;////已用容量
CString m_FreeSize;/////剩余容量
我们在CSysDiskInfoDlg中添加一个方法GetSysDisk,在头文件中声明,在.cpp文件中实现,实现代码如下:
TCHAR *szBuffer = new TCHAR[1024];
memset(szBuffer, 0, 1024);
try
{
int nRet = m_DiskInfo.EnumDisk(szBuffer);
if (nRet > 0)
{
m_DiskList.ResetContent();
TCHAR *szHeader=szBuffer;
while (*szHeader != 0)
{
m_DiskList.AddString(szHeader);
szHeader += wcslen(szHeader) + 1;
}
m_DiskList.SetCurSel(0);
OnSelchangeDisklist();
}
}
catch (...)
{
delete[] szBuffer;
}
delete[] szBuffer;
对于这个函数的调用,你需要在OnInitDialog函数中就调用,因此我们在OnInitDialog函数中加入代码:void CSysDiskInfoDlg::OnSelchangeDisklist()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szLetter[10] = { 0 };
m_DiskList.GetWindowText(szLetter, 10);
///获取剩余空间
__int64 nFreeSize = m_DiskInfo.GetFreeSpaceEx(szLetter);
char szSize[128] = { 0 };
_i64toa_s(nFreeSize, szSize, 128, 10);
m_FreeSize = szSize;
//获取总空间
__int64 nTotalSize = m_DiskInfo.GetTotalSpaceEx(szLetter);
_i64toa_s(nTotalSize, szSize, 128, 10);
m_TotalSize =szSize;
//获取已用空间
__int64 nOccupySize = nTotalSize - nFreeSize;
_i64toa_s(nOccupySize, szSize, 128, 10);
m_OccupySize = szSize;
UpdateData(FALSE);
}
UpdateData(FALSE)这句代码是将变量更新到窗口数据中。在这里我强调下,你必须将函数返回值返回为64位的,之前我用Int,没用_int64结果失败了!原因就是int表示的空间大小最多4GB,相对于磁盘容量太小了,所以你得声明为64位的返回值。
代码实现图(VS刷新较慢,每次切换磁盘符时,点两遍,否则的话,他保存的是之前磁盘的信息):
相关资讯