当前位置:C++技术网 > 资讯 > 得到电脑磁盘的空间大小

得到电脑磁盘的空间大小

更新时间:2015-11-18 22:48:16浏览次数:1+次

我们基于对话框创建项目,命名为SysDiskInfo,然后我们新建一个C++类,不是MFC类哦!

在解决资源管理器中右键项目->添加->类,弹出对话框,如图:

选择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函数中加入代码:
GetSysDisk();
最后我们建立ComboBox控件的消息函数,并响应它:
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刷新较慢,每次切换磁盘符时,点两遍,否则的话,他保存的是之前磁盘的信息):