如何解析NT样式设备路径\Device\CdRom0
,其逻辑盘符如G:\
?将Windows设备路径解析为驱动器号
编辑:卷名称与设备路径不一样,所以不幸GetVolumePathNamesForVolumeName()
将不起作用。
如何解析NT样式设备路径\Device\CdRom0
,其逻辑盘符如G:\
?将Windows设备路径解析为驱动器号
编辑:卷名称与设备路径不一样,所以不幸GetVolumePathNamesForVolumeName()
将不起作用。
希望下面这段代码会给你足够的解决这个 - 你已经初始化之后,你只需要通过收集迭代找到你的匹配。在插入到集合中以帮助查找性能之前,您可能希望将所有内容转换为大写/小写。
typedef basic_string<TCHAR> tstring;
typedef map<tstring, tstring> HardDiskCollection;
void Initialise(HardDiskCollection &_hardDiskCollection)
{
TCHAR tszLinkName[MAX_PATH] = { 0 };
TCHAR tszDevName[MAX_PATH] = { 0 };
TCHAR tcDrive = 0;
_tcscpy_s(tszLinkName, MAX_PATH, _T("a:"));
for (tcDrive = _T('a'); tcDrive < _T('z'); ++tcDrive)
{
tszLinkName[0] = tcDrive;
if (QueryDosDevice(tszLinkName, tszDevName, MAX_PATH))
{
_hardDiskCollection.insert(pair<tstring, tstring>(tszLinkName, tszDevName));
}
}
}
也许你可以使用GetVolumeNameForMountPoint并遍历所有安装点A:\到Z:\,当你找到一个匹配时打破?
http://msdn.microsoft.com/en-us/library/aa364994(VS.85).aspx
(我没有试过)
以下功能确实用C仅
BOOL GetWin32FileName(const TCHAR* pszNativeFileName, TCHAR *pszWin32FileName)
{
BOOL bFound = FALSE;
// Translate path with device name to drive letters.
TCHAR szTemp[MAX_PATH];
szTemp[0] = '\0';
if (GetLogicalDriveStrings(MAX_PATH - 1, szTemp))
{
TCHAR szName[MAX_PATH];
TCHAR szDrive[3] = TEXT(" :");
TCHAR* p = szTemp;
do
{
// Copy the drive letter to the template string
*szDrive = *p;
// Look up each device name
if (QueryDosDevice(szDrive, szName, MAX_PATH))
{
size_t uNameLen = _tcslen(szName);
if (uNameLen < MAX_PATH)
{
bFound = _tcsnicmp(pszNativeFileName, szName, uNameLen) == 0
&& *(pszNativeFileName + uNameLen) == _T('\\');
if (bFound)
{
// Replace device path with DOS path
StringCchPrintf(pszWin32FileName,
MAX_PATH,
TEXT("%s%s"),
szDrive,
pszNativeFileName + uNameLen);
}
}
}
// Go to the next NULL character.
while (*p++);
} while (!bFound && *p);
}
return(bFound);
}
如果您需要处理可移动驱动器,您可以使用GetLogicalDeviceStrings动态获取现存设备的工作。您需要截断设备字符串,以便尾随的“\”不会传递给QueryDosDevice。 – 2011-03-24 17:55:07