当前位置:C++技术网 > 资讯 > 如何获得磁盘字符串?

如何获得磁盘字符串?

更新时间:2015-11-09 22:44:44浏览次数:1+次

对GetLogicalDriveStrings的理解:

函数原形:


DWORD GetLogicalDriveStrings(
  DWORD nBufferLength,  // size of buffer
  LPTSTR lpBuffer       // drive strings buffer
);
说明:GetLogicalDriveStrings函数将一个缓冲区lpBuffer填入在计算机上存在的硬盘盘符.
参数说明:
nBufferLength是缓冲区lpBuffer的大小,以字节为单位.它的大小不包含最后的空字符.如果它的值为零,缓冲区不可用.
lpBuffer指向一个接收各种以零结尾的字符串缓冲区,一个空字符用来区分各个可用硬盘的,最后在末尾有再以空字符结尾,假如
你的电脑上有C,D两个硬盘盘符,则它能得到一个字符串是:
'C',':','\',' ','D',':','\',' ',' '
即:C:\<null>D:\<null><null>
返回值:
如果函数成功结束,返回值是获得的字符串长度,以字节为单位,不包括最后的一个空字符,好像上面的字符串获得的长度就是8;硬盘
盘符的个数自乘以4就是了;记住:一个ANSI-ASCII码的空字符是一个字节,而一个Unicode码的空字符是两个字节.如果这个缓冲区不
够大,返回值会比nBufferLength大,这是缓冲区要求去获得全部硬盘盘符的原因.
如果函数失败,这个返回值是0;用GetLastError可以捕获这个错误信息!


下面我们看下在两种字符集下GetLogicalDriveStrings函数的实现:

Unicode:


BOOL CCleanFileDlg::LoadDiskLetter()
{
	DWORD dwLen = GetLogicalDriveStringsW(0, NULL);////获取系统盘符字符串的长度
	if (dwLen > 0)
	{
		TCHAR *pNameList = new TCHAR[dwLen + 2];    //分配一个字符缓冲区
		memset(pNameList, 0, dwLen + 2);
		GetLogicalDriveStringsW(dwLen, (LPWSTR)pNameList);	//获取系统盘符,将其存储在pNameList中,格式为"C:\ D:\ E:\ F:\ ..."
		TCHAR *pItem = pNameList;
		while (*pItem != '\0')					//各盘符之间有一个空格,需要分解字符串,获取每一个盘符
		{
			m_Disk.AddString(pItem);			//向组合框中添加盘符
			pItem += wcslen(pItem) + 1;			//执行下一个盘符,加1是为过滤掉各盘符间的一个空格
		}
		//delete[] pNameList;
		return TRUE;
	}
	return FALSE;
}
ANSI:



BOOL CClearTmpFileDlg::LoadDiskLetter()				//加载系统盘符
{
	DWORD dwLen = GetLogicalDriveStrings(0, NULL);	//获取系统盘符字符串的长度
	if (dwLen > 0)
	{
		char *pNameList = new char[dwLen+1];		//分配一个字符缓冲区
		memset(pNameList, 0, dwLen+1);				
		GetLogicalDriveStrings(dwLen, pNameList);	//获取系统盘符,将其存储在pNameList中,格式为"C:\ D:\ E:\ F:\ ..."
		char *pItem = pNameList;
		while (*pItem != '\0')						//各盘符之间有一个空格,需要分解字符串,获取每一个盘符
		{
			m_Disk.AddString(pItem);				//向组合框中添加盘符
			pItem += strlen(pItem) + 1;				//执行下一个盘符,加1是为过滤掉各盘符间的一个空格
		}
		delete [] pNameList;						//释放字符缓冲区
		return TRUE;								//操作成功,返回TRUE
	}	
	return FALSE;
}
最后得实现结果: