对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可以捕获这个错误信息!
========================================================
/*
* 获取到根目录
*/
void CClient::GetRootDir(string &strRoot)
{
char szDrives[128];//临时变量
if (GetLogicalDriveStrings(sizeof(szDrives), szDrives)) //获取根目录
{
char *pTemp = szDrives; //临时字符指针
string strSubDir; //临时变量
while(TRUE)
{
if (*pTemp)
{
strSubDir += *pTemp;
}else if (!*pTemp && *(pTemp+1))
{
strSubDir.erase(strSubDir.end()); //删除最后的'\'
string strThirdDir;
GetThirdSubDir(strSubDir,strThirdDir); //获取子目录
strSubDir += strThirdDir;
strSubDir.insert(strSubDir.begin(), '<'); //左分隔标记
strSubDir +='>'; //右分隔标记
strRoot += strSubDir; //加入发送字符变量
strSubDir.erase(strSubDir.begin(), strSubDir.end());//清空该变量
}else
{
strSubDir.erase(strSubDir.end()); //删除最后的'\'
string strThirdDir;
GetThirdSubDir(strSubDir,strThirdDir); //获取子目录
strSubDir += strThirdDir;
strSubDir.insert(strSubDir.begin(), '<'); //左分隔标记
strSubDir +='>'; //右分隔标记
strRoot += strSubDir; //加入发送字符变量
strSubDir.erase(strSubDir.begin(), strSubDir.end());//清空该变量
break; //结束
}
pTemp++;
}
}
return;
}